zoukankan      html  css  js  c++  java
  • 异常处理

    try catch final执行顺序

    • final必然执行
    • 如果出现异常,会遍历catch执行匹配的

    return的问题

    return返回值使用栈保存,所以会

    • 在try中return并不会真的结束,而要等final执行完毕
    • 在return语句后更改return的变量值无法对实际值产生影响
    • try或catch中的return会被final中的return覆盖
    • 不应在finally中return和抛出新的异常 因为会导致原有的异常或是返回被覆盖

    缺陷

    在finally中return或是抛出新的异常会导致原本的返回或者异常被覆盖,导致异常丢失

    异常的限制

    覆盖方法的时候只能抛出在基类方法的异常说明里列出过的异常,但是基类异常说明中的异常也不一定都要出现.

    这点与继承中接口只能变大正好相反.

    构造器

    如果在构造器中执行了打开文件之类的操作,出现异常将不能被正确处理,因此编写构造器一定要特别小心.

    使用finally无法正常清理的原因在于,构造器执行一半出现异常导致并没有初始化完成,而finaly中又会执行清理,这就会出现错误.

    对于构造阶段可能出现异常且要求清理的类,可以使用嵌套的try-catch.

    try{
      InputFile in = new InputFile("clean.java");
      try{
          // 文件读取
      }
      catch(Exception e){
          // lalala
      }finally{
          //清理
      }
    }catch(Exception e){
        //lalala
    }

    这样就可以保证,当InputFile没有打开时进入外层catch不进行清理,而在内层出现异常时正常清理

    这种用法在构造器不抛出任何异常时也应该运用,基本规则为:在创建需要清理的对象之后,立即进入一个try-cache-finally语句块.

    异常匹配

    抛出异常之后,异常处理系统会按照代码顺序找出最近的处理程序,找到之后就不再继续查找.查找时并不要求完全匹配,派生的对象也可以匹配基类的处理程序





  • 相关阅读:
    ulimit -a
    nginx check_http_send type=http 查检测不到后端TOM的存活
    通过ip查找能应机器的MAC
    错误状态码URL重定向
    error_page 改变状态码为新的状态码,并显示指定内容
    使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器
    C#客户端嵌入Chrome浏览器的实现
    Task.Run c#启动线程
    C#利用webBrowser怎么去掉网页中不想显示的部分
    InDesign CC 2019安装包+破解
  • 原文地址:https://www.cnblogs.com/renluxiang/p/46486c3a4152315ad4f0cb73f25da549.html
Copyright © 2011-2022 走看看