我在想,是否可以“覆盖”或可能替换标准winforms .net异常形式?替换.net中的标准异常/错误形式
我谈论这个家伙:
是否有可能,孔程序的范围时,要重写此窗口?我的意思是automaticaly,而不必执行try/catch。
谢谢!
丹尼尔
我在想,是否可以“覆盖”或可能替换标准winforms .net异常形式?替换.net中的标准异常/错误形式
我谈论这个家伙:
是否有可能,孔程序的范围时,要重写此窗口?我的意思是automaticaly,而不必执行try/catch。
谢谢!
丹尼尔
您可以处理System.Windows.Forms.Application.ThreadException活动,显示您的自定义消息。
在webforms中,可以在global.asax中处理Application_Error。但似乎你在谈论winforms。在这种情况下:
尝试添加以下代码到你的主起动机方法:
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException);
,并定义的ExceptionHandler类,如下所示:http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx
您应该处理:
/// <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);
}
}
取自以下事件:
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
在这些处理程序中,您可以显示您制作的自定义表单。
这是ThreadExceptionDialog类,它派生自Form类。从它导出来改变对话框是一个失败的原因,你不能轻易地进入嵌入式控件。您可以创建自己的Form派生类来创建自己的对话框,只需给它一个带有Exception参数的构造函数即可。为Application.ThreadException实现一个事件处理程序来显示它。
请注意对话框中的根本缺陷。它希望用户在需要点击按钮来解除对话时做出正确的选择。一般来说,关于究竟发生了什么问题的信息相当模糊。这对你来说意味着什么,对用户来说,很少有什么比'哦废话'更重要。点击继续按钮通常不是正确的做法。
为了避免用户做出这样困难的选择,请在您的Main()方法中调用Application.SetUnhandledExceptionMode(),传递ThrowException,以避免引发事件。每个未处理的异常现在都会经过AppDomain.UnhandledException。包括在工作线程中产生的那些线程,例外情况是不会产生对话框。为它编写一个事件处理程序,并显示和/或记录e.ExceptionObject.ToString()的值。您可以自行决定如何将该信息提供给您的办公桌或用户的IT人员,以便您改进产品并使其机器稳定。
检查this链接。
从页面:
介绍
一个让我印象深刻,当我第一次开始学习.NET是其增强的异常处理功能的东西。我的意思是这样的功能,如轻松访问抛出的异常类型,完整的堆栈跟踪和内部异常。这使得在那些刚抓到顶级System.Exception的地方仍然可以获得完整的信息。我觉得这很方便,因为如果你不需要对特定类型的异常采取特定的操作,那么对于可能抛出的每种类型的异常都有连续的catch处理程序是很繁琐的。无论如何,即使你确实捕获了特定的异常,你通常也需要捕获System.Exception来掩盖自己并防止程序崩溃。因此,我发现我最终在我的代码中捕获了System.Exception。一个典型的情况是,在Windows窗体和ASP.NET Web窗体应用程序中,所有不重要的事件处理程序最终都包含try-catch System.Exception块。
麻烦的是,这样做还是有点凌乱的代码,并没有真正似乎很正确。有没有更好的办法?