吞未处理的异常,我使用SFTP使用Windows服务在C#中的文件传输(ssh.net)。 我已经处理了每个代码块中的异常仍然我得到未处理的异常和我的Windows服务崩溃。可我们在Windows服务
我用
AppDomain.CurrentDomain.UnhandledException
是有可能避免这种未处理的异常,并从被撞坏避免服务想通了约未处理的异常。
在此先感谢。 Vijay
吞未处理的异常,我使用SFTP使用Windows服务在C#中的文件传输(ssh.net)。 我已经处理了每个代码块中的异常仍然我得到未处理的异常和我的Windows服务崩溃。可我们在Windows服务
我用
AppDomain.CurrentDomain.UnhandledException
是有可能避免这种未处理的异常,并从被撞坏避免服务想通了约未处理的异常。
在此先感谢。 Vijay
不,因为UnhandledException
不会改变进程正在关闭的事实。它只是让你有机会做一些事情(例如记录失败)。
即使事情可以工作那样,事实是,你的服务有缺陷。你应该寻找更多的解决方法,而不是隐藏它们。
是有可能避免这种未处理的异常,并从被撞坏避免服务。
是的。这也是一个糟糕的设计决定。
AppDomain.CurrentDomain.UnhandledException
这是摆在万不得已的处理程序写入崩溃报告的好地方,然后重新启动该服务。
吞咽异常是不聪明。您期望的每个异常都必须处理。
我在每个处理异常和每一个代码块还是我收到未处理的异常
听起来像是你不知道你在做什么。没有必要在每个代码块中处理异常 - 它完全用异常处理程序重载代码。但是,有必要在有意义的地方进行适当的异常处理,并捕获每个SENSIBLE(可预期的)异常。
避免崩溃的服务是不聪明 - 因为如果你不知道你有什么异常,那么你可能会损坏的服务,而不是坠毁一个结束。快速而艰难地失败仍然是编写可靠服务器系统的唯一方式。
避免未处理的异常的唯一方法是不是有一个!假设你的服务没有使用任何多线程功能,这可能会在单独的线程上抛出异常,你可以绕过你的ServiceBase.Run呼叫
摆脱异常处理程序。这样,任何滑过的异常都可以在最后一刻抓到并处理。通常,虽然你想尝试抓住这些较低的和相应的处理
随着线程应用程序,它变得更加困难,因为每个生成的新线程不会抛出主线程,不会被处理'全部'处理程序。
编辑:
我想补充一点,我不纵容这样做 - 最好你应该在正确的地方来处理异常 - 如果你得到你不期望未处理的异常,那么你需要检查看看堆栈出了什么问题。将处理程序添加到AppDomain.UnhandledException并将异常树和堆栈写入日志将有所帮助(您确实有一些日志机制,对吧?)。要么或调试
提供异常的堆栈跟踪。另外一个你如何手动处理例外的例子将不胜感激。 – leppie 2012-07-09 10:54:33
如果您在某处添加了catch-all-exception处理程序,则说明您没有解决问题,并且正在控制症状。修复错误更好。 – Maarten 2012-07-09 10:57:13
例外情况应该是处理或预防,不能吃...... – Alex 2012-07-09 11:00:24