我需要在大量函數調用中以相同方式記錄錯誤。在這裏,我想從foo.create(...)
和File.new_tmp(...)
的錯誤被記錄handle_error(...)
。我如何分解出使用try {...} catch(Error e){log_error(e);}
// compile with `valac --pkg gio-2.0 main.vala`
void log_error(Error e) {
// error logging here
}
void main() {
var foo = File.new_for_path("foo");
try {
foo.create(FileCreateFlags.NONE);
} catch (Error e) {
log_error(e);
}
FileIOStream tmp_stream;
try {
File.new_tmp(null, out tmp_stream);
} catch (Error e) {
log_error(e);
}
}
(是的,main
應與FileIOStream
東西,如果繼續失敗foo.create
,這就是爲什麼他們在不同的try/catch
塊。)
我要分解出使用try {...} catch (Error e) {log_error(e);}
成功能如下所示:
delegate void Action();
void log_error(global::Action action) {
try {
action();
} catch (Error e) {
// error logging here
}
}
void main() {
var foo = File.new_for_path("foo");
log_error(() => foo.create(FileCreateFlags.NONE));
FileIOStream tmp_stream;
log_error(() => File.new_tmp(null, out tmp_stream));
}
但華劣克給予警告unhandled error 'GLib.IOError'
因爲你似乎無法趕上在關閉時拋出的錯誤,我也不能只是將log_error(...)
重寫爲#define
宏,因爲vala不支持它們。那麼我能做什麼?
@Crowder'new_for_path'不能根據[valadoc](http://references.valadoc.org/#!api=gio-2.0/GLib.File.new_for_path)拋出錯誤,但這只是一些無論如何,稍微複雜的示例代碼。 – mcjohnalds45
@Crowder在我真正的應用程序中,我的錯誤處理代碼只是告訴用戶一些事情搞砸了,我不想讓人們閱讀大量無關的代碼。 – mcjohnalds45
Oooooh我知道你的意思!我真的很抱歉,雖然你在嘲笑我無關緊要的事情。答案是否定的,當這些函數錯誤時'main'不需要返回。我已經編輯了這個問題,以減少愚蠢。 – mcjohnalds45