C#异常处理

什么是异常

Exception:通用规则之外的情况。比如:NullReferenceException,OutOfRangeException……

 

异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。

异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:trycatchfinallythrow

  • 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/

 

posted @ 2022-02-12 16:50  码上的飞鱼  阅读(244)  评论(0)    收藏  举报