C#的异常处理机制
任何完美的应用程序和技术高明的程序员,都不可能是绝对不出差错的。与其追求完美无错的代码,还不如将程序中可能预知的异常在发布前进行很好的处理,可能是最有价值的。那么,C#是如何处理异常的呢?首先,我们从最普通的异常说起:
使用 try-catch-finally块 捕获异常,基本格式如下:
1 try
2 {
3 // 获取并使用资源,可能出现异常
4 }
5 catch (DivideByZeroException de)
6 {
7 }
8 catch (ArithmeticException ae)
9 {
10 }
11 catch (Exception e)
12 {
13 // 捕获并处理异常,当出现多个异常且异常类之间有继承关系(DivideByZeroException==>ArithmeticException==>Exception),
14 // 捕获顺序是子类在前,基类在后
15 }
16 finally
17 {
18 // 无论什么情况(即使在catch块中return)下,都会执行该块的代码(如:关闭文件)
19 // 另外需要说明的是,在finally块中使用任何break、continue、return退出都是非法的。
20 }
ASP.NET异常处理
除了以上的try-catch-finally的处理方式外,还有三种方式来捕获异常:
1. 页面级错误处理(通过Page_Error事件)
protected void Page_Error( object sender, EventArgs e)
{
string errorMsg = String.Empty;
Exception currentError = Server.GetLastError();
errorMsg += " 系统发生错误:<br/> " ;
errorMsg += " 错误地址: " + Request.Url + " <br/> " ;
errorMsg += " 错误信息: " + currentError.Message + " <br/> " ;
Response.Write(errorMsg);
Server.ClearError(); // 清除异常(否则将引发全局的Application_Error事件)
}
2. 应用程序级(global.asax)错误处理(通过Application_Error事件)
protected void Application_Error( object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Exception iex = ex.InnerException;
string errorMsg = String.Empty;
string particular = String.Empty;
if (iex != null )
{
errorMsg = iex.Message;
particular = iex.StackTrace;
}
else
{
errorMsg = ex.Message;
particular = ex.StackTrace;
}
// AddLog(errorMsg, particular);
Server.ClearError(); // 处理完及时清理异常
}
3. 应用程序配置(web.config)
<system.web>
<!--mode有三种值:On,Off,RemoteOnly,defaultRedirect出现错误重定向的URL-->
<customErrors mode= " On " defaultRedirect= " ErrorPage.htm " >
<!--statusCode错误状态码,redirect错误重定向的URL-->
<error statusCode= " 403 " redirect= " NoAccess.htm " />
<error statusCode= " 404 " redirect= " FileNoFound.htm " />
</customErrors>
</system.web>
WinForm应用程序异常处理
在WinForm的应用程序中,除了采用try-catch-finally的方式外,如何实现全局的异常处理呢?因为不具有Application_Error事件,但可以通过委托的方式来实现。
internal class ThreadExceptionHandler
{
// 实现错误异常事件
public void Application_ThreadException( object sender, ThreadExceptionEventArgs e)
{
try
{
// 如果用户单击"Abort"则退出应用程序
DialogResult result = ShowThreadExceptionDialog(e.Exception);
if (result == DialogResult.Abort)
{
Application.Exit();
}
}
catch
{
try
{
MessageBox.Show( " 严重错误 " , " 严重错误 " , MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
}
private DialogResult ShowThreadExceptionDialog(Exception e)
{
string errorMsg = " 错误信息:\t\t " + e.Message + " \t\t " + e.GetType() + " \t\t " + e.StackTrace;
return MessageBox.Show(errorMsg, " Application Error " , MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
ThreadExceptionHandler handler = new ThreadExceptionHandler();
Application.ThreadException += new ThreadExceptionEventHandler(handler.Application_ThreadException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new frmEvent());
}
}
public partial class frmEvent : Form
{
private void btnException_Click( object sender, EventArgs e)
{
throw new InvalidOperationException( " 无效的操作异常! " );
}
}
LinkFrom:http://HdhCmsTestcnblogs测试数据/hmiinyu/archive/2011/11/11/2245578.html
VS2008 插件 CodeRushX 下载地址 Posted on 2012-07-02 23:05 NoNames 阅读(18) 评论( 0 ) 编辑 收藏
http://go.devexpress测试数据/CodeRushX.aspx
分类: C# (ASP.NET) , C# (WinForm)
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息