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=对数误差(…)代码>,对吗?