现在的位置: 首页 > 综合 > 正文

.NET处理异常–zt

2012年01月11日 ⁄ 综合 ⁄ 共 3203字 ⁄ 字号 评论关闭
在.NET中如果用try...catch语句来处理异常,代码很多,请问怎样自定义一个错误处理类,当有异常时,自动引发错误处理类.


1楼 btut2004

可以啊
if (flag==1) throws new myexection("hello world");

public myexception : exception
{
public myexception(string msg)
{
Console.WriteLn(msg);
}
}


2楼 zhouzh197895

if (flag==1) throws new myexection("hello world");
谢谢!象以上语句,是代码运行之前可以先知的,比如说一些数据溢出等无法先知的系统错误,系统运行时能够自动引发自定义的错误处理类.


3楼 btut2004

try{

all your code in hear;

}
catch(Exception e)
{
throw new myexception("hello world");
}


4楼 AhBian

楼主的意思是:不对每段代码进行直接的异常处理,而是由一个专门的功能类来处理这些异常吧。

首先,我不赞成这个想法,每一个功能块、代码段都有各自的逻辑和状态,专门的功能类不适合也不可处理得了所有的异常情况,而且如果异常不及时处理的话,所有后继代码都不能得以继续。

第二,应该有一个专门的功能类来处理没有正确处理的异常,也就是说这些异常是开发过程中未预计到的异常。

对于第二点,可以通过处理 Application.ThreadException(注意:这个事件需要关闭 JIT 异常调试功能再能被引发)和 AppDomain.CurrentDomain.UnhandledException 两个事件。

如以下代码所示(具体如何处理,自行实现,仅提供一个思路):
public class ExceptionManager
{

        #region Constructors
    private ExceptionManager()
    {
    }

        #endregion

        public static void Attach()
        {
            Application.ThreadException += new ThreadExceptionEventHandler(ExceptionManager.Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionManager.AppDomain_UnhandledException);
        }

        public static void Detach()
        {
            Application.ThreadException -= new ThreadExceptionEventHandler(ExceptionManager.Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(ExceptionManager.AppDomain_UnhandledException);
        }

// ……

    }
在 Application.Run 之前调用 Attach 方法,在之后调用 Detach 方法。

要关闭 JIT 异常调试,请在配置文件中加入以下配置节:
<system.windows.forms jitDebugging="false" />

以上示例仅用于 WinForm 应用程序。


5楼 zhouzh197895

还是用了try...catch,我是想如果整个系统都这样用,那么代码会很多.


6楼 btut2004

我明白了,你是要做一个用户友好的界面。每当出错就屏蔽。
只显示简单友好的出错信息。
我也不知道怎么做。继续关注


7楼 zhouzh197895

我的意思正是楼主说的第二点,不知道在webform中可不可以,我试试.


8楼 AhBian

ExceptionManager.Application_ThreadException
ExceptionManager.AppDomain_UnhandledException
两个方法的代码,我没有提供。

在这两个方法中,你就可以自已决定来如何处理未预计的异常了,当然也可再显示一个窗口,来告诉用户有未预计的异常发生了。并且可以像微软的 Windows 错误报告一样,在用户点击一个“发送错误报告”按钮时搜集异常信息(包括机器信息和其他状态信息)并发送到你公司的技术支持人员那里。

但对于 AppDomain.CurrentDomain.UnhandledException 事件,其事件参数 UnhandledExceptionEventArgs 中有一个属性 IsTerminating。如果此值为 true,说明已发生了致命性异常错误,这时可能已不适合再显示一个错误报告窗口了,这种情况下我的做法是显示一个 MessageBox,同时将异常信息复制到系统剪贴板上,负责的用户可以从系统剪帖板上复制异常信息后再发送给公司的技术支持人员。不过,值得一提的是,我所使用的 MessageBox 是一个增强后的消息框,其中有一个特点:能够使用鼠标在消息框上选取和复制异常信息(一个只读文本框),而普通的消息框是不能这么操作的。

这个 MessageBox 的增强实现方法来自以下文章:
http://msdn.microsoft.com/msdnmag/issues/02/11/CuttingEdge/


9楼 zhouzh197895

web.config里设置<customErrors mode="RemoteOnly" defaultRedirect="Error.aspx" />来使用Error.aspx统一处理页面的所有异常,可是跳转到Error.aspx页时Server.GetLastError()却捕获不到任何异常,请问有谁知道是什么原因?怎样才能捕获异常?


0楼 baron

开发一个异常处理类还是有好处的,但问题是做起来很难做得能用,好用。
异常有系统异常和业务异常。通常我们需要将异常的信息进行处理,而不是简单的抛出来。但系统异常都有那么多,全部做精确的处理太麻烦了。
通常,大部分异常都是由于程序没经过严格的测试引起的,对程序加上录入后检测数据合法是必须的。所以通常只要处理业务异常了,再处理一些常见的系统异常。


1楼 hning123

1. 你把web.config里设置<customErrors mode="On" defaultRedirect="Error.aspx" />
2. 在Global.asax.vb中Application_Error事件中加入
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
If Not Context Is Nothing And Context.IsCustomErrorEnabled Then
Server.Transfer("cerror.aspx", False)
End If
End Sub
3.在error.aspx.vb中加入
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)handles MyBase.Load
Dim ex As Exception = Server.GetLastError.GetBaseException
Label1.Text = ex.Message
End Sub
试一下!!!!!!你别忘了在你的异常的时候throw出来....

抱歉!评论已关闭.