首先,我很抱歉一定是重复的帖子。我似乎无法在SO上缩小我的搜索范围并谷歌找到我正在寻找的东西。
我目前正在一家商店工作,他们喜欢冒泡的例外。当编译的应用程序进行测试时,尝试获取异常的详细信息(消息和堆栈跟踪)是一件很大的痛苦。 Windows显示了那个熟悉的盒子,它缺少任何细节。
在花了将近一个小时后发现测试盒的水晶报告版本错误之后,我添加了这个简单的代码,可能很熟悉。
static void Main(string[] arg)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run( ... );
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.ToString());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show((e.ExceptionObject as Exception).ToString());
}
这可以完成工作,但我不允许检查它。在app.config中或通过注册表设置有什么方法可以让CLR显示或记录已编译的.net应用程序的异常详细信息吗?
提前感谢您的帮助。
答案 0 :(得分:1)
如果要配置日志输出,请使用log4net。
答案 1 :(得分:0)
我正在使用WPF,所以这里所有未处理的异常都会消失,它可能对您的需求有用:
Private Sub Application_DispatcherUnhandledException(ByVal sender As Object, ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs) Handles Me.DispatcherUnhandledException
'TODO: Log error'
Dim sb As New System.Text.StringBuilder(e.Exception.Message & vbCrLf)
Dim ex = e.Exception.InnerException
While ex IsNot Nothing
sb.AppendLine("______________ inner exception: ______________")
sb.AppendLine(ex.Message)
sb.AppendLine(vbCrLf)
ex = ex.InnerException
End While
If MessageBox.Show(sb.ToString, "Exception caught", MessageBoxButton.OKCancel) = MessageBoxResult.Cancel Then Stop
e.Handled = True
End Sub
接受我的道歉我没有时间重写它,我只是复制了原始代码,我相信它仍然有用。
由于
答案 2 :(得分:0)
如果你知道如何在VB.NET中编码,那么Shimmy的解决方案很方便。
然后你可以递归地进入ex.InnerException.InnerException.
......依此类推......构建一个完整的消息
(1)如果ex.Message
不是null
或Empty
,请显示。
(2)如果ex.InnerException
不是null
则显示ex.InnerException.Message
。
答案 3 :(得分:0)
您可以选择在条件编译符号中包装调试处理代码。这将允许您提供您想要用于测试目的的详细日志记录,但在应用程序的发布版本中最终用户无法使用这些日志记录。
答案 4 :(得分:0)
您似乎错过了try-catch
方法中的顶级Main()
。有关示例,请参阅one of my answers。
我不会使用MessageBox
,而是使用一个静态方法以您想要/需要的方式记录问题,然后显示一个通用的“意外致命错误。[Bla bla bla]”消息并在Ok上杀死正在运行的进程。
答案 5 :(得分:0)
你能使用Enterprise Library吗?有可能对您有用的异常处理和日志记录块。您可以将异常处理块配置为notify and rethrow原始异常,并使用Logging Block记录详细信息。它可以是一个陡峭的山坡,可以抓住它,但我认为它最终是值得的。