【发布时间】:2011-05-16 15:11:40
【问题描述】:
我的应用没有涵盖所有的异常情况。在运行时,有时会弹出一个窗口,显示错误:“系统空引用异常”或“文件或目录已损坏且无法读取”。一旦错误窗口出现,它不会消失,直到用户使用按钮做出响应。
我想捕获这些异常并且不想向用户显示这些错误窗口。
【问题讨论】:
标签: c# .net exception-handling
我的应用没有涵盖所有的异常情况。在运行时,有时会弹出一个窗口,显示错误:“系统空引用异常”或“文件或目录已损坏且无法读取”。一旦错误窗口出现,它不会消失,直到用户使用按钮做出响应。
我想捕获这些异常并且不想向用户显示这些错误窗口。
【问题讨论】:
标签: c# .net exception-handling
您可以通过签署 UnhandledException 事件来捕获 AppDoamin 级别上的所有异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
【讨论】:
AppDomain.CurrentDomain.UnhandledException += (sender, e) => { MessageBox.Show(e.ExceptionObject.ToString()); }; Thread otherThread = new Thread(() => { // logic causing DivisionByZeroException int i = 0; i = i / i; }) { IsBackground = true }; otherThread.Start();
Application.ThreadException += new Application_ThreadException;
您需要将代码包装在 try {} catch(Exception e) {} 块中,以便您自己捕获错误。
示例:
try
{
// all of my code
}
catch ( Exception e )
{
// show my own error dialog
}
【讨论】:
听起来您需要回顾一下您的代码并查看您的异常处理。要么有部分代码不在 try/catch 块内,要么有一些 try/catch 块不能处理所有可能的异常。
您需要确保当您使用 try/catch 块包装这些代码部分时,您不仅会吃掉错误,还会记录它们。您不希望您的应用程序出现意外错误而没有发生任何事情,因为这些意外错误会使您的应用程序处于易受攻击的状态。有时,让您的应用程序崩溃比隐藏这些错误更好。
这是一篇关于使用try/catch的好文章:
http://msdn.microsoft.com/en-us/library/ms173160.aspx
当您实现try/catch 时,请确保您还考虑放入finally 以清理任何连接信息或其他应关闭的代码。它看起来像这样:
try
{
//Your existing code
}
catch (Exception ex)
{
//Here is where you log the error - ex contains your entire exception so use that in the log
}
finally
{
//Clean up any open connections, etc. here
}
请注意,catch 块会捕获通用的Exception,因此上面(在更具体的 catch 块中)未捕获的所有错误都应在此处捕获。
【讨论】:
尝试将所有MessageBox.Show() 语句替换为Logger.LogInfo(ex.Message); 之类的内容。或许可以使用Log4Net 之类的日志记录解决方案。
【讨论】: