【问题标题】:Return statements in catch blocks在 catch 块中返回语句
【发布时间】:2010-03-03 17:39:36
【问题描述】:

我看到一些开发人员在 catch 块中使用 return 语句。为什么/何时这是一种有用的技术?

编辑:实际上我刚刚看到使用了 return 关键字。

谢谢

【问题讨论】:

    标签: .net exception-handling return catch-block


    【解决方案1】:

    有些时候你并不关心抛出的异常,只关心 Try 操作失败。一个例子是 TryParse 函数,它在伪代码中看起来像:

    try
    {
       //attempt conversion
       return true;
    }
    catch
    {
       return false;
    }
    

    【讨论】:

      【解决方案2】:

      公共无效函数() {

      try 
      { 
          //some code here
      }
      catch
      { 
          return;
      }
      

      }

      返回时;命中,执行流程跳出函数。这只能在 void 方法上完成。

      编辑:如果您不想执行其余功能,请执行此操作。例如,如果您正在执行文件 IO 并且发生读取错误,则您不希望执行处理该文件中数据的代码,因为您没有它。

      【讨论】:

        【解决方案3】:

        如果您知道函数的返回值应该在 catch 块中,这将很有用。

        例子:

        public bool IsDatabaseAvailable() {
            try {
                // connect
                return true;
            }
            catch (Exception) {
                return false;
            }
            finally {
                // clean up
            }
        }
        

        【讨论】:

        • 其实我只是看到使用了return关键字。
        • @dotnetdev:与什么相反?我正在使用 return 关键字。
        • 对不起,我的意思是“意思”(我实际上只是指 return 关键字...使用过)。
        【解决方案4】:

        您可能想要捕获错误,记录它并说返回值 false 表示函数是否成功。在其他情况下,您可能希望返回一些在 try 块中计算的数据

        【讨论】:

          【解决方案5】:

          .Net Framework 中的某些方法在格式不正确时会抛出异常。

          一个很好的例子是int.TryParse(object value)

          如果您的值为“10s”,则会引发异常。在这种情况下,我们知道这是因为无效转换。

          所以

          try 
          { 
              int.TryParse(value);
              return true; 
          }
          catch { return false; }
          

          可能是一个函数,它告诉我们字符串是否是一个有效的整数。

          如果您确实使用该表单来解决此问题,请不要执行 catch (Exception ex),因为这样做会强制 .Net 序列化对象内部的错误,这有点慢。

          另外重要的是要记住,即使您在 try catch 块中使用 return,它仍然会执行 finally 块。

          因此,如果您的清理代码在 finally 中,请不要担心框架会确保调用它。

          我的 2 美分。 N.

          【讨论】:

          • 我想你的意思是int.Parse,它会抛出无效的格式; int.TryParse 从不抛出,返回一个表示解析成功的 bool,并接受一个 out int 第二个参数。仅供参考。
          【解决方案6】:

          如果尝试失败,您还有其他选择。 例如,检查 file 是否可用于某些 operation

              bool IsComplete = false;
          
              try
              {
                //  FileStream currentWriteableFile = 
                               File.OpenWrite(sFileLocation);          
              }
              catch(Exception)
              {
                return false;
              }
          

          【讨论】:

            猜你喜欢
            • 2017-05-15
            • 1970-01-01
            • 2014-10-02
            • 2021-12-25
            • 1970-01-01
            • 2014-08-25
            • 2018-10-14
            • 2014-07-16
            • 2011-02-11
            相关资源
            最近更新 更多