>>606
Rustなら色々やり方あろうけど、わかりやすい例にするとこうなる。

fn main() {
match sub() {
Ok(result) => { commit(); println!("OK: {}", result); },
Err(err) => { rollback(); println!("ERROR: {}", err); },
}
}

sub() -> Result<DataType, Error> {
let a = foo()?;
let b = bar()?;
baz(a, b)
}

foo(), bar(), baz()各々はResultでエラー値も同時に返しているが、エラーチェックはまとめて出来る。
ResultはOkとErrの2つを取るenumであり、matchは強力なswitch相当と思っていただければいい。
try catchといった例外処理がなくてもプログラミングで困ることはない。