2012-07-09 113 views
0

吞未处理的异常,我使用SFTP使用Windows服务在C#中的文件传输(ssh.net)。 我已经处理了每个代码块中的异常仍然我得到未处理的异常和我的Windows服务崩溃。可我们在Windows服务

我用

AppDomain.CurrentDomain.UnhandledException 

是有可能避免这种未处理的异常,并从被撞坏避免服务想通了约未处理的异常。

在此先感谢。 Vijay

+0

提供异常的堆栈跟踪。另外一个你如何手动处理例外的例子将不胜感激。 – leppie 2012-07-09 10:54:33

+1

如果您在某处添加了catch-all-exception处理程序,则说明您没有解决问题,并且正在控制症状。修复错误更好。 – Maarten 2012-07-09 10:57:13

+0

例外情况应该是处理或预防,不能吃...... – Alex 2012-07-09 11:00:24

回答

3

不,因为UnhandledException不会改变进程正在关闭的事实。它只是让你有机会做一些事情(例如记录失败)。

即使事情可以工作那样,事实是,你的服务有缺陷。你应该寻找更多的解决方法,而不是隐藏它们。

+0

服务的行为就是这样,如果我已经开始文件传输,如果路由器断电,它肯定会抛出异常,并且我已经处理但仍然未处理。不知道为什么? – vijay 2012-07-09 11:14:33

+1

如果它未处理,那么显然你没有处理它。 – Jon 2012-07-09 11:15:30

1

是有可能避免这种未处理的异常,并从被撞坏避免服务。

是的。这也是一个糟糕的设计决定。

AppDomain.CurrentDomain.UnhandledException

这是摆在万不得已的处理程序写入崩溃报告的好地方,然后重新启动该服务。

吞咽异常是不聪明。您期望的每个异常都必须处理。

我在每个处理异常和每一个代码块还是我收到未处理的异常

听起来像是你不知道你在做什么。没有必要在每个代码块中处理异常 - 它完全用异常处理程序重载代码。但是,有必要在有意义的地方进行适当的异常处理,并捕获每个SENSIBLE(可预期的)异常。

避免崩溃的服务是不聪明 - 因为如果你不知道你有什么异常,那么你可能会损坏的服务,而不是坠毁一个结束。快速而艰难地失败仍然是编写可靠服务器系统的唯一方式。

+0

我在sFTP路由器上传输文件,并且有可能路由器未连接,路由器在进程之间关闭。所以会引发异常。我也有记录机制,所以我想通了,我处理的异常再次被抛出。 – vijay 2012-07-09 11:09:59

+0

不,对不起。大多数运行到2-3个基本例外。网络不是一个未知的情况。在一个合格的程序员不能解决所有问题的许多地方,应该不会有这么多例外。在相关的代码部分,你甚至可能有一个捕获(例外) - 但只有在那里,没有其他地方。 – TomTom 2012-07-09 11:10:30

0

避免未处理的异常的唯一方法是不是有一个!假设你的服务没有使用任何多线程功能,这可能会在单独的线程上抛出异常,你可以绕过你的ServiceBase.Run呼叫

摆脱异常处理程序。这样,任何滑过的异常都可以在最后一刻抓到并处理。通常,虽然你想尝试抓住这些较低的和相应的处理

随着线程应用程序,它变得更加困难,因为每个生成的新线程不会抛出主线程,不会被处理'全部'处理程序。

编辑:

我想补充一点,我不纵容这样做 - 最好你应该在正确的地方来处理异常 - 如果你得到你不期望未处理的异常,那么你需要检查看看堆栈出了什么问题。将处理程序添加到AppDomain.UnhandledException并将异常树和堆栈写入日志将有所帮助(您确实有一些日志机制,对吧?)。要么或调试

相关问题