1、普通异常 ,一般来说,能够预见的异常都要进行处理。主要是进行异常的捕捉处理。 try{}catch{}finally{}语句块是捕捉处理异常的语句块。在try里捕捉能够预见的异常, 在catch里处理捕捉的异常,而在finally语句是无论有没有发生异常都会执行到,一般是执行一些资源的关闭释放工作,防止内存的泄露。
2、向上层抛出, 在给别人提供二次开发的API时,如果在dll里捕捉了异常,有时必要向上层抛出已经捕捉的异常,让上层再进行处理,此时可以用到异常抛出语句throw,在抛出的异常时,要向客户提供API说明在什么情况下有异常抛出,让其在应用里添加异常的捕捉和处理。
3、系 统回调函数的异常, 系 统回调函数一定要进行异常处理。如果一个系统回调函数不进行异常处理,则程序会把异常抛给系统,程序会出现崩溃的情况。而且无法得到错误的信息,开发者极 难调式。此类型的异常通常会在系统回调函数里进行处理。比较一个线程入口函数,一般可以在函数的开始地方进行try, 开始捕捉异常,这样可以避免程序把异常抛给系统。
4、处理未捕捉异常 , 在.Net环境中提供对未捕捉的异常进行系统级的捕捉,系统对运行的监视,如果一些未捕捉的异常则会向系统抛出,系统则会捕捉到此类异常。则开发者则需要向系统注册一个未捕捉的异常处理函数。下面是例子:
//处理未捕获的异常
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Appliction_ThreadException);
//处理非UI线程异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
#region 处理未捕获异常的挂钩函数
static void Application_ThreadException(object sender, System.ThreadingExceptionEventArgs e)
{
Exception error = e.Exception as Exception;
if(null != error)
{
LogRecord.putErrorLog(string.Format("出现应用程序未处理的异常/n异常类型:
{0}/n异常消息:{1}/n异常位置:{2}/n", error.GetType().Name, error.Message, error.StackTrace), "main");
}
else
{
LogRecord.putActionLog(string.Format("Application ThreadError:{0}", e));
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
cn.ccets.papercontrol.FullScreenHandle.ShowTray();
Exception error = e.ExceptionObject as Exception;
if(null != error)
{
LogRecord.putActionLog(string.Format("Application UnhandledException:{0};/n
堆栈信息:{1}", error.Message, error.StackTrace));
}
else
{
LogRecord.putActionLog(string.Format("Application UnhandledError:{0}", e));
}
}