Język
Błędy i cleanup
Opisuj oczekiwane błędy przez Result i Option, a zasoby sprzątaj deterministycznie.
Option i Result
Option<T> przechowuje Some(value) albo None. Result<T, E> przechowuje Ok(value) albo Err(error). Wyrażenie match musi obsłużyć wszystkie warianty.
result.orvi
1fn load_config(path: string) -> Result<string, string> {2 defer print("load finished")3 let contents = fs.read_text(path)?4 return Ok(contents)5}67let result = load_config("orvi.toml")8print(match result {9 Ok(contents) => contents,10 Err(message) => "error: " + message,11})
Propagacja przez ?
Operator ? rozpakowuje Some i Ok. None albo Err natychmiast wraca z bieżącej zgodnej funkcji. Ścieżka błędu pozostaje widoczna bez powtarzania ręcznych match.
defer i using
defer rejestruje wyrażenie wykonywane w kolejności LIFO przy wyjściu z zakresu, także przez return, propagację błędu i anulowanie. using łączy związanie wartości z wyrażeniem sprzątającym.
cleanup.orvi
1fn work() -> Result<void, string> {2 using resource = "database" => print("zamknięto", resource)3 defer print("koniec")4 fs.write_text("result.txt", "gotowe")?5 return Ok()6}