• [整理]ASP.NET 中异常处理


    [整理]ASP.NET 中异常处理

    1.直接通过重写Controller的OnException来处理异常#

    public class HomeController : Controller
    {
    public ActionResult Index( )
    {
    throw new Exception( "test ex." );
    return View( );
    }

    protected ILog Log
    {
      get { return LogManager.CreateLog( ); }
    }	
    
    protected override void OnException( ExceptionContext filterContext )
    {
      // 处理异常
      if( !filterContext.ExceptionHandled )
      {
        var ex = filterContext.Exception;       
        Log.Error( ex.Message );
        Log.Error( ex.StackTrace );
    
        filterContext.ExceptionHandled = true;
      }
    
      base.OnException( filterContext );
    }
    

    }

    2.通过添加自定义Filter并继承HandleErrorAttribute,重写OnException来处理异常

    public class MvcHandleErrorAttribute : HandleErrorAttribute
    {
    protected ILog Log
    {
    get { return LogManager.CreateLog( ); }
    }

    public override void OnException( ExceptionContext filterContext )
    {
      // 处理异常
      if( !filterContext.ExceptionHandled )
      {
        var ex = filterContext.Exception;
        Log.Error( ex.Message );
        Log.Error( ex.StackTrace );
    
        filterContext.ExceptionHandled = true;
      }
    
      base.OnException( filterContext );
    }
    

    }

    public class FilterConfig
    {
    public static void RegisterGlobalFilters( GlobalFilterCollection filters )
    {
    //filters.Add( new HandleErrorAttribute( ) );
    filters.Add( new MvcHandleErrorAttribute( ) );
    }
    }

    方案1和2可以单独使用,也可以同时使用,但是要注意的是,如果方案1和2同时存在,先进入方案2的OnException,后进入方案1的OnException,所以为了避免重复处理,在处理完异常后,执行
    filterContext.ExceptionHandled = true;
    这样,服务端响应返回一个EmptyResult实例,而不再返回一个异常(常见的黄页)

    方案2中,由于自定义Filter是特性Attribute,即可以设置全局,也可以设置Controller,也可以设置Action,

    3.通过自定义IHttpModule或是Global里处理异常

    public class ExceptionModule : IHttpModule
    {
    private HttpApplication _application;

    protected ILog Log
    {
      get { return LogManager.CreateLog( ); }
    }
    
    public void Dispose( )
    {
      //DO NOTHING
    }
    
    public void Init( HttpApplication context )
    {
      _application = context;
      
     //注册异常事件方法
      _application.Error += new EventHandler( OnApplicationError );
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException );
    }
    
    void OnApplicationError( object sender, EventArgs e )
    {
      var loggedAccout = WebWorkContext.Current.LoggedAccount;
      var ex = _application.Server.GetLastError( );
    
      Log.Error( ( loggedAccout == null ) ? "n/a" : loggedAccout.Name );
      Log.Error( ex.Message );
      Log.Error( ex.StackTrace );
    }
    
    void CurrentDomain_UnhandledException( object sender, UnhandledExceptionEventArgs e )
    {
      if( e.ExceptionObject == null )
        return;
    
    
      Exception ex = e.ExceptionObject as Exception;
      Log.Error( ex.Message );
      Log.Error( ex.StackTrace );
    }
    

    }

    和自定义IHttpModule里一样,在Global的 Application_Start里注册异常事件方法
    public class MvcApplication : System.Web.HttpApplication
    {
    protected void Application_Start( )
    {
    //注册异常事件方法
    this.Error += new EventHandler( OnApplicationError );
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException );
    }

    void OnApplicationError ( object sender, EventArgs e )
    {
      var ex = _application.Server.GetLastError( );
      Log.Error( ex.Message );
      Log.Error( ex.StackTrace );
    }
    

    }

    4.未解决的问题

    public class HomeController :Controller
    {
    public ActionResult Index( )
    {
    int count = 0;

      Thread thread = new Thread( ( ) =>
      {
        throw new Exception( "Test线程异常" );//异常无限循环抛出,WebDev.Server4.0.exe停止工作。如何解决?
      } );
    
      thread.Start( );
    
      //throw new Exception( "test ex." );
    
      return View( );
    }
    

    }

    5.WebApi中

    public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute
    {
    protected ILog Log
    {
    get { return LogManager.CreateLog( ); }
    }

    public override void OnException( HttpActionExecutedContext actionExecutedContext )
    {
      //处理异常
      var ex = actionExecutedContext.Exception;
      Log.Error( ex.Message );
      Log.Error( ex.StackTrace );
    
      base.OnException( actionExecutedContext );
    }
    

    }

    public static class WebApiConfig
    {
    public static void Register( HttpConfiguration config )
    {
    ...
    config.Filters.Add( new WebApiExceptionFilterAttribute( ) );
    }
    }

    参考:

    http://www.cnblogs.com/luminji/archive/2011/01/05/1926033.html
    http://www.asp.net/web-api/overview/error-handling/exception-handling

  • 相关阅读:
    树莓派关闭swap文件[浙大嵌入式系统]
    树莓派之objdump [浙大嵌入式系统]
    树莓派RAM[浙大嵌入式系统]
    温湿度传感器dht11的lcd显示[嵌入式系统]
    ucos II[嵌入式系统]
    MooTools 1.4 源码分析 Fx.CSS
    MooTools 1.4 源码分析 (关于Core、Type等模块分析)
    MooTools 1.4 源码分析 Fx.Tween
    MooTools Class.Mutators 如何建立一个我们自己的Mutator
    Javascript各种循环测试,达夫设备可用性分析
  • 原文地址:https://www.cnblogs.com/Benoly/p/4206498.html
Copyright © 2020-2023  润新知