WebApplication开发中通常是需要使用异常捕获,以提供给用户良好的提示页面。
为了减少代码,统一日志处理,可以在 Global.asax 中 Application_Error 的事件处理方法中统一处理。
它将捕获所有 Application 级别的 UnhandleException 和 HttpException(比如:访问的页面不存在等)
总之,在这里处理的话,那么在页面中的所有 try/catch 处理都可以不要了。
void
Application_Error(
object
sender, EventArgs e) {
//
Code that runs when an unhandled error occurs
try
{ Server.Transfer(
"
~/Error.aspx
"
); }
catch
{
//
ignore
} }
因为 Server.Transfer 将固定抛出 ThreadAbort Exception 异常,不用理会。
然后在指定的 Error.aspx 里你可以通过 Server.GetLastError() 来进行,错误分类,日志处理,显示信息等工作。
public
partial
class
Error : System.Web.UI.Page {
protected
void
Page_Load(
object
sender, EventArgs e) {
if
(
!
IsPostBack) { Exception ex
=
Server.GetLastError().GetBaseException();
this
.Label1.Text
=
DateTime.Now.ToString();
if
(ex
!=
null
) {
//
错误的信息
this
.Label2.Text
=
ex.Message;
//
错误的堆栈
this
.Label3.Text
=
ex.StackTrace.Replace(
"
"
,
"
<br/>
"
);
//
出错的方法名
this
.Label4.Text
=
ex.TargetSite.Name;
//
出错的类名
this
.Label5.Text
=
ex.TargetSite.DeclaringType.FullName; }
//
清空最后的错误
Server.ClearError(); } } }
BTW: WinForm开发的时候也可以统一捕获Exception,不过这是在偷懒的时候才会这么干的。
- [STAThread]
- staticvoid Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1());
- Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
- }
- staticvoid Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
- {
- // Error Handling
- MessageBox.Show(e.Exception.Message);
- }