Error handling 我如何计算出我使用'try{…}catch(Error e){log_Error(e);}`

Error handling 我如何计算出我使用'try{…}catch(Error e){log_Error(e);}`,error-handling,closures,vala,Error Handling,Closures,Vala,我需要在大量函数调用中以相同的方式记录错误。这里我希望foo.create(…)和File.new\u tmp(…)中的错误由handle\u error(…)记录 //使用'valac--pkg gio-2.0 main.vala'编译 无效日志错误(错误e){ //此处记录错误 } void main(){ var foo=File.new_代表_路径(“foo”); 试一试{ create(FileCreateFlags.NONE); }捕获(错误e){ 日志错误(e); } FileIO

我需要在大量函数调用中以相同的方式记录错误。这里我希望
foo.create(…)
File.new\u tmp(…)
中的错误由
handle\u error(…)
记录

//使用'valac--pkg gio-2.0 main.vala'编译
无效日志错误(错误e){
//此处记录错误
}
void main(){
var foo=File.new_代表_路径(“foo”);
试一试{
create(FileCreateFlags.NONE);
}捕获(错误e){
日志错误(e);
}
FileIOStream tmp_流;
试一试{
new_tmp(null,out tmp_stream);
}捕获(错误e){
日志错误(e);
}
}
(是的,
main
如果
foo.create
失败,则应继续使用
FileIOStream
内容,这就是它们位于单独的
try/catch
块中的原因。)

我想将
try{…}catch(Error e){log_Error(e);}
的用法分解为如下函数:

委托无效操作();
无效日志_错误(全局::操作){
试一试{
动作();
}捕获(错误e){
//此处记录错误
}
}
void main(){
var foo=File.new_代表_路径(“foo”);
日志_错误(()=>foo.create(FileCreateFlags.NONE));
FileIOStream tmp_流;
日志_错误(()=>File.new_tmp(null,out tmp_流));
}

但是valac给出了警告
未处理的错误'GLib.IOError'
,因为您似乎无法捕获闭包中抛出的错误,我也不能将
日志错误(…)
重写为
。\define
宏,因为vala不支持它们。那么我能做什么呢?

您可以捕获在闭包中抛出的异常,您只需要让委托抛出异常。你想要的可能是这样的:

公共委托T?Action()抛出GLib.Error;
T日志错误(全局::操作函数){
试一试{
返回func();
}捕捉(油嘴滑舌的错误e){
//此处记录错误
返回null;
}
}
空干管(){
var foo=File.new_代表_路径(“foo”);
日志_错误(()=>foo.create(FileCreateFlags.NONE));
FileIOStream?tmp_stream=null;
GLib.File?f=log_error(()=>File.new_tmp(null,out tmp_stream));
}

请注意,我已将其设置为泛型,因此您可以实际使用返回值。如果需要,删除泛型类型参数并返回void应该很简单,但会失去一些灵活性。

@Crowder
new\u for\u path
无法根据抛出错误,但这只是一些稍微复杂的示例代码。@Crowder在我的实际应用程序中,我的错误处理代码只是告诉用户出了什么问题,我只是不想让人们阅读大量不相关的代码。噢,我知道你的意思!我真的很抱歉,我以为你一直在为一些不相关的东西烦我lol。答案是否定的,
main
不需要在那些函数出错时返回。我对这个问题进行了编辑,使其不那么愚蠢。我对vala一无所知,但FWIW似乎是一个bug——如果您的
log\u error
接受了捕获错误的委托,那么您上面的东西似乎应该可以工作。祝你好运
log\u error
返回一个可为空的
GLib.File
。在这种情况下,它应该是
GLib.File?f=对数误差(…),对吗?