[整理]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

[整理]ASP.NET 中异常处理的更多相关文章

  1. ASP.NET中异常处理的注意事项

    一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...

  2. ASP.NET MVC异常处理

    ASP.NET MVC异常处理方案 如何保留异常前填写表单的数据 ASP.NET MVC中的统一化自定义异常处理 MVC过滤器详解 MVC过滤器使用案例:统一处理异常顺道精简代码 ASP.NET MV ...

  3. asp.net中当服务器出错时显示指定的错误页面

    http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...

  4. ASP.NET中处理异常的几种方式

    1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...

  5. asp.net中常用的几种身份验证方式

    转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html   前言 在B/S系统开发中,经常需要使用"身份验证&q ...

  6. 使用Jquery解决Asp.Net中下拉列表值改变后访问服务器刷新界面。

    使用DropDownList控件时,改变选项时,获取服务端数据库数据并刷新界面数据. 1. 绑定DropDownList控件SelectedIndexChanged事件. 2. AutoPortBac ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...

  8. NET中异常处理的最佳实践

    NET中异常处理的最佳实践 本文翻译自CodeProject上的一篇文章,原文地址. 目录 介绍 做最坏的打算 提前检查 不要信任外部数据 可信任的设备:摄像头.鼠标以及键盘 “写操作”同样可能失效 ...

  9. ASP.NET中的C#基础知识

    ASP.NET中的C#基础知识 说明:asp.net作为一种开发框架现在已经广为应用,其开发的基础除了前端的html.css.JavaScript等后端最重要的语言支持还是C#,下面将主要用到的基础知 ...

随机推荐

  1. D. Vasya and Arrays

    链接 [http://codeforces.com/contest/1036/problem/D] 题意 给你两个数组长度分别为n,m; 有这么一种操作,用某个数组的某个子区间元素之和代替这个子区间, ...

  2. LeetCode 628. Maximum Product of Three Numbers三个数的最大乘积 (C++)

    题目: Given an integer array, find three numbers whose product is maximum and output the maximum produ ...

  3. SCRUM 12.17

    今天,我们的用户统计功能终于上线了!! 大家辛苦工作了许久.我们测试的用户统计功能效果模拟如下 还有一些好消息,比如,我们的应用在小米平台收到了崩溃的反馈报告. 这说明我们留下的一些BUG暴露了出来, ...

  4. SCRUM 12.15

    今天我们所有的团队成员都加速的进行着开发.虽然最近3门大作业压着,我们还是抽出了足够多的时间对项目的M2阶段进行完善. 今天我们完成了清除缓存的功能,另外我们的单页爬虫也已经设计完成,我们的进度在我们 ...

  5. Linux内核分析——第三周学习笔记

    20135313吴子怡.北京电子科技学院 chapter1 知识点梳理 一.Linux内核源代码简介 (视频中对目录下的文件进行了简介,记录如下) arch目录 占有相当庞大的空间 arch/x86目 ...

  6. Maven 学习笔记——Maven环境配置(1)

    在学习Selenium的过程中,接触到了Maven(项目管理工具),不至于学一路忘一路,左耳朵进右耳多出,还是决定边学边记录,毕竟听的不如 看的,看的不如写的吗.首先学一样东西,肯定得明确学的是什么, ...

  7. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  8. API接口重复提交

    重复提交的几种情况1.利用JavaScript防止表单重复提交 按钮禁用2.利用Session令牌防止表单重复提交 具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时 ...

  9. oracle-表空间剩余空间大小占比查询

    select tablespace_name, max_gb, used_gb, round(100 * used_gb / max_gb) pct_used from (select a.table ...

  10. python netifaces usage

    1. install python dev sudo apt-get install python-dev 2.download src code and install https://pypi.p ...