我在想,是否有可能“覆盖”或者可能取代标准的winforms .net异常形式??
我在谈论这个家伙:
在孔程序的范围内,是否可以覆盖此窗口?我的意思是自动,无需执行try / catch。
答案 0 :(得分:2)
您可以处理System.Windows.Forms.Application.ThreadException事件以显示自定义消息。
答案 1 :(得分:2)
您应该处理以下两个事件:
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
在这些处理程序中,您可以显示自己制作的自定义表单。
答案 2 :(得分:2)
这是ThreadExceptionDialog类,它派生自Form类。从中导出来改变对话框是一个失败的原因,你不能轻易地进入嵌入式控件。你可以创建自己的Form派生类来创建自己的对话框,只需给它一个带有Exception参数的构造函数。为Application.ThreadException实现一个事件处理程序来显示它。
请注意对话框中的基本缺陷。它希望用户在需要单击按钮以关闭对话框时做出正确的选择。一般而言,关于究竟出了什么问题的相当模糊的信息。它对你来说意味着什么,对用户来说很少就是'哦废话'。单击“继续”按钮通常不是正确的做法。
要避免用户做出如此困难的选择,请在Main()方法中调用Application.SetUnhandledExceptionMode(),并传递ThrowException以便永远不会引发该事件。现在每个未处理的异常都会通过AppDomain.UnhandledException。包括在工作线程中引发的那些,不生成对话框的异常。为它编写一个事件处理程序,并显示和/或记录e.ExceptionObject.ToString()的值。您需要找到一种方法将信息提供给您的桌面或用户的IT员工,这样您就可以改进产品并使他们的机器稳定。
答案 3 :(得分:0)
在webforms中,您可以在global.asax中处理Application_Error。但似乎你在谈论winforms。在那种情况下:
尝试将以下代码添加到主启动器方法中:
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException);
并按如下方式定义ExceptionHandler类:
/// <summary>
/// Main thread error handler.
/// </summary>
public sealed class ExceptionHandler
{
private ExceptionHandler()
{}
/// <summary>
/// Handles an exception on the main thread.
/// </summary>
/// <param name="sender"></param>
/// <param name="t"></param>
public static void OnThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
result = ShowThreadExceptionDialog(t.Exception);
}
catch
{
try
{
MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// Exits the program when the user clicks Abort.
if (result == DialogResult.Abort)
Application.Exit();
}
// Creates the error message and displays it.
private static DialogResult ShowThreadExceptionDialog(Exception e)
{
string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
}
取自:http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx
答案 4 :(得分:0)
检查this链接。
从页面:
<强>简介强>
当我第一次开始学习.NET时给我留下深刻印象的是其增强的异常处理功能。我的意思是这样的功能,如轻松访问抛出的异常类型,完整的堆栈跟踪和内部异常。这样可以很容易地在那些只捕获顶级System.Exception的地方获取完整信息。我觉得这很方便,因为如果你不需要对特定类型的异常采取特定的操作,那么为每种可能引发的异常类型设置连续的catch处理程序是很繁琐的。在任何情况下,即使你确实捕获了特定的异常,你通常也需要捕获System.Exception来掩盖自己并防止程序崩溃。因此,我发现我最终在我的代码中捕获了System.Exception。典型的情况是,在Windows窗体和ASP.NET Web窗体应用程序中,我的所有非平凡事件处理程序最终都包含try-catch System.Exception块。
麻烦的是,这仍然会使代码混乱,并且看起来并不是很正确。还有更好的方法吗?