Skip to content

Commit 7998f70

Browse files
committed
finish try catch
1 parent b09efdc commit 7998f70

2 files changed

Lines changed: 44 additions & 18 deletions

File tree

lang/examples/try_catch.modu

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,11 @@ try {
22
error("test");
33
} catch e {
44
print("error: " + e);
5+
}
6+
7+
try {
8+
let obj = { "test": 1 };
9+
print(obj.testt);
10+
} catch e {
11+
print("error: " + e);
512
}

lang/src/vm/vm.rs

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,7 @@ impl VM {
817817
self.stack.pop();
818818
self.stack.push(v.clone());
819819
}
820+
820821
None => {
821822
let method = match crate::natives::object::get_fn(name.to_string()) {
822823
Some(m) => m,
@@ -825,11 +826,13 @@ impl VM {
825826
let closest = find_closest(name.clone(), props);
826827

827828
if let Some(closest) = closest {
828-
return Err(self.runtime_error_with_help(
829+
self.handle_error_with_help(
829830
format!("undefined property '{}' on object", name),
830831
format!("did you maybe mean: '{}'?", closest.green()),
831832
span
832-
));
833+
)?;
834+
835+
continue;
833836
} else {
834837
self.handle_error(format!("undefined property '{}' on object", name), span)?;
835838
continue;
@@ -849,11 +852,13 @@ impl VM {
849852
let closest = find_closest(name.clone(), crate::natives::string::list_fns().into_iter());
850853

851854
if let Some(closest) = closest {
852-
return Err(self.runtime_error_with_help(
855+
self.handle_error_with_help(
853856
format!("undefined property '{}' on string", name),
854857
format!("did you maybe mean: '{}'?", closest.green()),
855858
span
856-
));
859+
)?;
860+
861+
continue;
857862
}
858863

859864
self.handle_error(format!("undefined property '{}' on string", name), span)?;
@@ -871,11 +876,13 @@ impl VM {
871876
let closest = find_closest(name.clone(), crate::natives::int::list_fns().into_iter());
872877

873878
if let Some(closest) = closest {
874-
return Err(self.runtime_error_with_help(
879+
self.handle_error_with_help(
875880
format!("undefined property '{}' on int", name),
876881
format!("did you maybe mean: '{}'?", closest.green()),
877882
span
878-
));
883+
)?;
884+
885+
continue;
879886
}
880887

881888
self.handle_error(format!("undefined property '{}' on int", name), span)?;
@@ -893,11 +900,13 @@ impl VM {
893900
let closest = find_closest(name.clone(), crate::natives::float::list_fns().into_iter());
894901

895902
if let Some(closest) = closest {
896-
return Err(self.runtime_error_with_help(
903+
self.handle_error_with_help(
897904
format!("undefined property '{}' on float", name),
898905
format!("did you maybe mean: '{}'?", closest.green()),
899906
span
900-
));
907+
)?;
908+
909+
continue;
901910
}
902911

903912
self.handle_error(format!("undefined property '{}' on float", name), span)?;
@@ -915,11 +924,13 @@ impl VM {
915924
let closest = find_closest(name.clone(), crate::natives::array::list_fns().into_iter());
916925

917926
if let Some(closest) = closest {
918-
return Err(self.runtime_error_with_help(
927+
self.handle_error_with_help(
919928
format!("undefined property '{}' on array", name),
920929
format!("did you maybe mean: '{}'?", closest.green()),
921930
span
922-
));
931+
)?;
932+
933+
continue;
923934
}
924935

925936
self.handle_error(format!("undefined property '{}' on array", name), span)?;
@@ -952,11 +963,13 @@ impl VM {
952963
let closest = find_closest(name.clone(), properties.keys().cloned());
953964

954965
if let Some(closest) = closest {
955-
return Err(self.runtime_error_with_help(
966+
self.handle_error_with_help(
956967
format!("undefined property '{}' on instance of {}", name, class_name),
957968
format!("did you maybe mean: '{}'?", closest.green()),
958969
span
959-
));
970+
)?;
971+
972+
continue;
960973
} else {
961974
self.handle_error(format!("undefined property '{}' on instance of {}", name, class_name), span)?;
962975
continue;
@@ -1077,7 +1090,10 @@ impl VM {
10771090
}
10781091
}
10791092

1080-
_ => return Err(format!("{} is not iterable", iter.type_name())),
1093+
_ => {
1094+
self.handle_error(format!("{} is not iterable", iter.type_name()), span)?;
1095+
continue;
1096+
}
10811097
}
10821098
}
10831099

@@ -1102,7 +1118,8 @@ impl VM {
11021118
self.globals.insert(path.clone(), module);
11031119
}
11041120
} else {
1105-
return Err(format!("unknown stdlib module '{}'", path));
1121+
self.handle_error(format!("unknown stdlib module '{}'", path), span)?;
1122+
continue;
11061123
}
11071124
} else {
11081125
let current_dir = self.source_path
@@ -1146,7 +1163,8 @@ impl VM {
11461163
let ast = crate::parser::parse(&source, &resolved.display().to_string());
11471164

11481165
if ast.is_err() {
1149-
return Err(format!("failed to parse package"));
1166+
self.handle_error("failed to parse package".to_string(), span)?;
1167+
continue;
11501168
}
11511169

11521170
let mut compiler = crate::compiler::compiler::Compiler::new();
@@ -1222,11 +1240,12 @@ impl VM {
12221240
let closest = find_closest(name.clone(), self.globals.keys().cloned());
12231241

12241242
if let Some(closest) = closest {
1225-
return Err(self.runtime_error_with_help(
1243+
self.handle_error_with_help(
12261244
format!("undefined variable '{}'", name),
12271245
format!("did you maybe mean: '{}'?", closest.green()),
12281246
span
1229-
));
1247+
)?;
1248+
continue;
12301249
}
12311250

12321251
self.handle_error(format!("undefined variable '{}'", name), span)?;
@@ -1344,7 +1363,7 @@ impl VM {
13441363

13451364
Ok(())
13461365
} else {
1347-
Err(self.runtime_error(msg, span))
1366+
Err(self.runtime_error_with_help(msg, help, span))
13481367
}
13491368
}
13501369
}

0 commit comments

Comments
 (0)