C#预先捕获异常或验证参数

时间:2016-04-29 06:59:57

标签: c# performance exception

这是关于异常处理和预防的问题。

public static string PathCombineNoEx(string path1, string path2)
{
   if (path1 == null || path2 == null /*Either validate here*/)
   {
      return null;
   }

   try
   {
      return System.IO.Path.Combine(path1, path2);
   }
   catch (ArgumentException /*or catch here*/)
   {
      return null;
   }
}

由于异常是对性能的巨大打击,我们应该尽量减少抛出异常的机会。在下面的示例中,我消除了Path.Combine可能抛出ArgumentnullException的可能性。这很容易做到并且几乎不会以任何方式影响性能。但是,如果两个参数字符串中的一个包含Path.Combine提供的任何无效字符,ArgumentException也会抛出GetInvalidPathChars

  1. 现在,你会建议像我一样抓住这个,还是在调用Path.Combine之前真的检查无效字符?
  2. 适用于大多数情况的一般性建议如何?
  3. 也许微软有关于此的文章?
  4. Path.Combine文件:
    https://msdn.microsoft.com/de-de/library/fyy7a5kt(v=vs.110).aspx

    .NET参考资料来源:
    http://referencesource.microsoft.com/#mscorlib/system/io/path.cs,2d7263f86a526264

    Microsft性能提示(参见减少异常章节):
    https://msdn.microsoft.com/en-us/library/ms973839.aspx

3 个答案:

答案 0 :(得分:3)

  1. 捕获异常,因为异常抛出堆栈跟踪
  2. 捕捉异常的可读性较差;它是一种臭名昭着的 goto :如果发生了某些事情,那么 goto catch
  3. 这就是为什么我投票支持验证

       if (path1 == null) 
         return null;
       if (path2 == null) 
         return null; 
    
       //TODO: put other validations here, e.g. Path.GetInvalidFileNameChars()  
    
       return System.IO.Path.Combine(path1, path2);
    

    仅捕获例外案例的例外情况:

       try {
         // I can't validate this, since just after I've finished it and ready to read 
         // someone can
         //   - delete/rename the file
         //   - change permissions
         //   - lock file (e.g. start writing to it) 
         String data = File.ReadAllText(@"C:\MyData.txt"); 
         ...
       }
       catch (IOException e) {
         ... 
       } 
    

答案 1 :(得分:2)

正如该术语所说,例外是为了处理意外情况。我投票预先处理代码中的可预见案例。

答案 2 :(得分:0)

例外可能会影响效果。

如果是API,

    .content-section-b {
    padding: 50px 0;
    background-color: #3C5A78;
}

.carousel-control.left {
    background-image:none;
}

.carousel-control.right {
    background-image:none;
}

否则,德米特里的答案就行了。

有用的SO帖子:

Business Objects, Validation And Exceptions

Why are Exceptions said to be so bad for Input Validation?