[整理]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
[整理]ASP.NET 中异常处理的更多相关文章
- ASP.NET中异常处理的注意事项
一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...
- ASP.NET MVC异常处理
ASP.NET MVC异常处理方案 如何保留异常前填写表单的数据 ASP.NET MVC中的统一化自定义异常处理 MVC过滤器详解 MVC过滤器使用案例:统一处理异常顺道精简代码 ASP.NET MV ...
- asp.net中当服务器出错时显示指定的错误页面
http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...
- ASP.NET中处理异常的几种方式
1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...
- asp.net中常用的几种身份验证方式
转载:http://www.cnblogs.com/dinglang/archive/2012/06/03/2532664.html 前言 在B/S系统开发中,经常需要使用"身份验证&q ...
- 使用Jquery解决Asp.Net中下拉列表值改变后访问服务器刷新界面。
使用DropDownList控件时,改变选项时,获取服务端数据库数据并刷新界面数据. 1. 绑定DropDownList控件SelectedIndexChanged事件. 2. AutoPortBac ...
- 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本
原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...
- NET中异常处理的最佳实践
NET中异常处理的最佳实践 本文翻译自CodeProject上的一篇文章,原文地址. 目录 介绍 做最坏的打算 提前检查 不要信任外部数据 可信任的设备:摄像头.鼠标以及键盘 “写操作”同样可能失效 ...
- ASP.NET中的C#基础知识
ASP.NET中的C#基础知识 说明:asp.net作为一种开发框架现在已经广为应用,其开发的基础除了前端的html.css.JavaScript等后端最重要的语言支持还是C#,下面将主要用到的基础知 ...
随机推荐
- Notepad++常用插件
Notepad++常用插件 1.CCompletion 进行文本的方法查找的工具. 会点击Ccompletion中的CCompletion菜单,就会出现菜单选择框 2.Compare 进行文本比较的工 ...
- Win10环境配置Bitcoin Core节点
区块链是当下比较火热的技术,我也来蹭下热度,研究一把Bitcoin Core的技术. 入门篇 一.Bitcoin Core安装 1.下载 一般有2种安装方式:源码编译安装 和 下载现成的安装包安装 源 ...
- dubbo底层之Netty
背景 Java线程:由开始的单线程,到通过new Thread()创建的多线程,再到现如今的线程池,Java多线程编程的效率和性能有了很大的提升 Reactor模型:基于事件驱动,适合处理海量I/O事 ...
- 【Alpha】第八次Scrum meeting
今日任务一览: 姓名 今日完成任务 所耗时间 刘乾 学习js并学会使用js读写xml文件.学习python读取xml的方式... 然后上午满课,下午从1点到10点当计组助教去沙河教了一下午+一晚上,所 ...
- Struts2中 radio标签的详细使用方法
首先在页面中引入struts标签库: <%@ taglib prefix="s" uri="/struts-tags"%> 在JSP页面中创建单选按 ...
- Activiti随着Spring启动自动部署开关
Activiti的act_re_deployment表NAME_列:全部显示SpringAutoDeployment. 查阅Activiti,https://github.com/Activiti/A ...
- centos 7 安装截图软件shutter
1.解决 epel-release依赖问题 ,执行命令: yum insatll epel-release 2.然后下载nux-dextop-release-0-5.el7.nux.noarch.rp ...
- css命名管理混乱?不妨试试BEM
css的缺陷 我们知道,css使用中一个比较令人烦恼的问题,就是css没有作用域可言,我们写了一个组件或者模块之后,往往希望它们可以四处复用,但是由于css没有作用域,我们给样式命名的时候都会非常小心 ...
- 【设计模式】——工厂方法FactoryMethod
前言:[模式总览]——————————by xingoo 模式意图 工厂方法在MVC中应用的很广泛. 工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建 ...
- 【模板】Floyd
int n; ][MAX_N + ]; void Floyd() { ; k <= n; ++k) { ; i <= n; ++i) { ; j <= n; ++j) { d[i][ ...