c#中怎样实现vb6中的on error goto errHandler的类似错误处理

whatafuckinglongname 2011-07-21 10:18:09
在vb6中,可以给每一个函数加上这样的错误处理代码

private function foo() as long
on error goto errHandler

exit function
errHandler:
debug.print "in foo()," ,err.description
LogMsg "in foo()," & err.description
foo = -1
end function


这样,如果在这个函数内部产生任何错误(我们不需要事先确切地知道错误的类型),一般都不会影响到外部调用的函数。

但是,在c#中,如果要实现同样的功能,岂不是要在每个函数中像这样:
private int foo()
{
try
{
// 主体代码
}
catch(Exception ex)
{
LogMsg("in foo()," + ex.message);
return -1;
}
}


之所以提出这个问题,是由于最近一个windows service的程序,
以下的代码片段

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
LogMsg("elapsed 正在运行...");
List<string> list;
list = GetRecorderList();
if (list.Count != 0)
{
foreach (string s in list)
{
LogMsg("正在处理" + s + "的数据...");
ImportToYingSi3(s);

}
}
}

在开发用的电脑上调试、测试都没问题,但安装到另一台电脑后,总是在记录到第一条“正在处理xxx的数据...”之后,就再也没有接下来的输出了,怀疑在ImportToYingSi3(s);中出现了错误。但是,如果出错,而且是未处理的错误 (因为对于可以预见的错误,都会有LogMsg的)为什么它又不退出!!??
所以想把整个ImportToYingSi3都放到Try块里去,看看到底有什么错误。但是又感觉这种方式相当地别扭。。
各位有没有遇到过这种问题,是怎么解决的呢
...全文
208 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy20101027 2011-07-21
  • 打赏
  • 举报
回复
try catch finally
ohkuy 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 whatafuckinglongname 的回复:]


C# code

private int foo()
{
try
{
// 主体代码
}
catch(Exception ex)
{
LogMsg("in foo()," + ex.message);
return -1;
}
}

这样的笨方法,终于找到原因所在了,找到之到,我想还是把try...catch去掉了的好,看着顺眼
[/Quote]
我觉得不能看顺不顺眼,
还要考虑程序的健壮性,
假如有异常但不抛出,
(有其它方法处理另外)
很可能造成程序崩溃
窗户纸 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 net_lover 的回复:]
catch用的多会影响性能的。写代码,你要自己你在执行什么操作,比如做除法,
a /b
你应该判断
if(b ==0 ) 就不进行了,而不是都进行try catch
[/Quote]
我做过实验,如果没有抛出异常,使用try{}catch没有对性能造成什么影响,但如果异常,抛出catch的时间会很长,因此尽量预先检查错误对性能有帮助,但是在程序调试阶段,最好对每个方法增加try..catch,这样有助于排错,即使到release时,如果程序没有错误,也同样不会对性能造成影响。
另外,可以把catch中的处理内容也单独做成一个方法,这样可以省不少事,效果和写on error goto xxx就差不多了。
  • 打赏
  • 举报
回复
private int foo()
{
try
{
// 主体代码
}
catch(Exception ex)
{
LogMsg("in foo()," + ex.message);
return -1;
}
}

这样的笨方法,终于找到原因所在了,找到之到,我想还是把try...catch去掉了的好,看着顺眼
bloodish 2011-07-21
  • 打赏
  • 举报
回复
ImportToYingSi3函数体里如果有临界资源竞争,那么存在死锁的可能性? 贴一下具体代码.
个人不觉得Try Catch会大多的影响性能,但是在Foreach里做Try-Catch,显然是无法接受的.

  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ohkuy 的回复:]

对于可预见的错误我一般用if……else 或其它,尽量不用try……catch,
太占资源了,
不可预见的错误就只能用try……catch
[/Quote]
那像我主贴里提到的这种情况,不可预见的错误,而且是对于整个函数的代码,只能把整个函数体都放到try里了吗
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 net_lover 的回复:]

catch用的多会影响性能的。写代码,你要自己你在执行什么操作,比如做除法,
a /b
你应该判断
if(b ==0 ) 就不进行了,而不是都进行try catch
[/Quote]
嗯,谢谢指点。
ohkuy 2011-07-21
  • 打赏
  • 举报
回复
对于可预见的错误我一般用if……else 或其它,尽量不用try……catch,
太占资源了,
不可预见的错误就只能用try……catch
孟子E章 2011-07-21
  • 打赏
  • 举报
回复
catch用的多会影响性能的。写代码,你要自己你在执行什么操作,比如做除法,
a /b
你应该判断
if(b ==0 ) 就不进行了,而不是都进行try catch

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧