C#异常处理
什么是异常
Exception:通用规则之外的情况。比如:NullReferenceException,OutOfRangeException……
异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。
异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
- try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
- catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
- finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
- throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。
异常处理方式
抛(throw)出异常
try { var user = this._userService.GetUser(this.UserID); user.UserName = model.UserName; user.Email = model.Email; user.LanguageID = model.LanguageID; user.Description = model.Description; this._userService.UpdateUserBaseInfo(user); SuccessNotice(this.Intl("Common.Message.SaveSuccessfully")); return RedirectToAction("EditProfile"); } catch (Exception e) { Util.Logger.Error(e.Message, e); ErrorNotice(this.Intl("Common.Message.SaveFailed") + "<br/>" + e.Message); throw new Exception("抛出异常信息"); }
抛出异常,会中断程序执行:以免程序继续执行造成数据错误等
捕捉异常(try...catch...finally)
被抛出的异常,(如果没有被处理/捕获)会直接传递给它的调用者,再由调用者传递给它的调用者,...,直到程序最顶层调用,程序崩溃
为了避免程序崩溃,我们需要try...catch来捕获异常
try //尝试 { SLevel level = Map(101); } catch (FileNotFoundException) //捕获 { //如果是FileNotFoundException //记录到日志,不再抛出 } catch (IndexOutOfRangeException) { //如果是IndexOutOfRangeException //发送Email给维护人员,不再抛出 } catch (Exception) { //其他异常处理 throw; //将异常再次抛出 }
可以根据不同的异常类型,进行不同的处理。
finally:无论有无异常(即使有return)都要执行的代码(比如关闭文件流)
使用注意事项
throw:
- 异常会带来较大的资源开销(性能损耗),所以要尽可能避免异常被抛出(不是不写throw exception的代码)
- 不要使用exception做为分支判断条件
- 尽可能的使用具体的、.NET现有的异常
try...catch:
- 不知道怎么处理的,就不要处理
- 不要catch之后,啥都不做(或者就包裹一下),直接throw
-
总是在程序入口(顶层方法)处catch未捕获的异常
finally:
- 如果仅仅是为了释放资源,推荐使用using块
- 使用using时注意和try...catch的搭配
文章转载自:快速开发平台– 云微平台
地址:https://www.hocode.com/