Exception 我有时会忽略我的异常,这可以吗?

Exception 我有时会忽略我的异常,这可以吗?,exception,exception-handling,Exception,Exception Handling,我有一个最佳实践问题。我意识到这是主观的,但我想问问比我聪明的人这是否是一种常见的编程实践 如果您有一种不想干扰应用程序重要功能的非关键方法,那么像这样使用错误接收器是常见的吗 Try 'do stuff. not important if it fails. Catch ex as exception 'sink. do nothing. End Try 如果你想雇用我,你读了我的一些代码,看到了这个…你会吗 赛斯 编辑 哇!谢谢你的回答。我认为大家的共识是永远不应该

我有一个最佳实践问题。我意识到这是主观的,但我想问问比我聪明的人这是否是一种常见的编程实践

如果您有一种不想干扰应用程序重要功能的非关键方法,那么像这样使用错误接收器是常见的吗

Try 
    'do stuff.  not important if it fails.

Catch ex as exception
    'sink.  do nothing.
End Try
如果你想雇用我,你读了我的一些代码,看到了这个…你会吗

赛斯

编辑 哇!谢谢你的回答。我认为大家的共识是永远不应该这样做,或者应该非常罕见

我想我会给你这个问题的背景。首先,我非常熟悉Karl Sequin的文章,并且多年来一直遵循这种模式

但是今天在我正在进行的项目中,我正在浏览变更列表,并且面临着添加一个简单特性的问题。(如果您想知道……它正在向富文本框添加上下文菜单支持。)

随附的便条上写着:“如果时间超过15分钟……就放弃它。”

因此,我面临着添加一个潜在有用的特性,但我没有时间测试它是否不会破坏工作特性。作为记录,这个系统的异常处理程序确实有一个机制来处理和记录这些错误。但是,如果我在一个没有健壮的错误处理系统的系统上工作呢。是否可以添加此功能,如果出现错误,则不会真正丢失任何内容

那是我的想法。但我把你的信息牢记在心…基本上这是个坏主意


赛斯

是的,这很常见,但一般来说不应该这样做

有一些异常,比如
OutOfMemoryException
,最好不要捕获它们,除非您捕获它们是为了尝试优雅地终止应用程序


在大多数情况下,吞咽
System.Exception
System.SystemException
将不可避免地隐藏进一步的运行时问题。

这是常见的,但最好避免。至少你应该把异常记录在某个地方


另外,避免对流控制使用异常。您的代码应该在不诉诸异常的情况下处理所有可能的情况。除了性能提高之外,此方法还告诉您,当发生异常时,值得注意。

您不应该在此处捕获所有异常。在极少数情况下,忽略一个特定的、预期的异常可能是可以的。然而,捕获所有异常并吞咽它们将意味着您尝试在发生
OutOfMemoryException
和其他不可恢复的异常后继续操作最佳实践表明您不应该这样做。什么是如此不重要,以至于您不想知道发生了错误?我想我从未遇到过这种情况

我要么不使用try-catch结构,要么将代码重构为一个返回布尔值的方法,这样我至少可以确定它是否成功

这是我的想法

更新:有时您可能需要接收异常。在这些情况下,我将确定哪些异常可能是该异常的候选项,然后捕获这些特定异常。但这远远不能捕获异常,异常可以是任何东西,比如前面提到的
OutOfMemoryException
。简言之,我只捕捉特定的异常,并有意忽略它。

我会说“不要这样做”——不是那样的

首先,尝试重构“非关键”代码,使其不会引发异常


如果您无法做到这一点,至少不要盲目捕捉异常。只捕获您希望它抛出的异常(并将它们记录在某个地方!)——其他任何事情都需要注意。

我个人认为这是非常糟糕的做法

这是(不幸的)我在查看代码时总是要寻找的东西之一,当我发现空的catch块或实质上吞噬异常的catch块时,我会问以下问题:

  • 此时此刻,你是否100%确信这一例外永远不会发生
  • 您是否也100%确定,无论代码库是如何开发的,将来在这里捕获的任何异常都不会有任何影响
  • 即使1和2都是真的,在这里写日志真的很难吗
  • 对我来说,最重要的是日志记录——良好的异常记录和良好的程序执行跟踪是设计代码的基础,这些代码可以随着时间的推移进行安全修改,并发展成为用户信任的稳定系统


    除此之外,一个好的做法是只捕获特定的异常,并让所有其他异常在堆栈中冒泡。盲目地处理异常作为处理错误的一种方式是永远不正确的

    。如果使用vs2008,您至少可以将它们发送到调试窗口

     System.Diagnostics.Debug.WriteLine("exception in method - my method -: "+ex.message);
    

    您应该从不隐藏异常。不管怎样,我可能会雇用你,但你在为我工作时不会这么做:)

    但是,严肃地说,在Java中(例如),异常用于某些您可以选择忽略的情况,例如
    FileNotFoundException
    (就像您所做的那样,带有注释)。但是,如果您捕获到一种类型的异常,比如
    IOException
    ,您就不能将其隐藏起来。如果异常对您来说没有什么特别的意义,请将其包装在
    RuntimeException
    中,并将其提交给客户端


    在这个过程中,
    异常应该得到处理,但决不能隐藏。

    不,我认为这不好

    您的系统可能并不重要,但您可能确实希望它运行,否则一开始就不会编写它。现在,如果有一天它停止运行,必须维护它的人不知道它为什么突然不工作,就像你所说的那样
    try {
       Cache.refresh(myObject)
    }
    catch (NotInCacheException) {
       // If the object isn't already in the cache, then we don't have to worry 
       // about refreshing it. It's assumed that this is a common occurrence,
       // so we don't need to log it either; that ends up just spamming
       // the logs. So, just swallow it, silently.
    }
    
    try {
       conn.close()
    }
    catch( Exception e ) {
    }
    
    StatCode stat = parseXYZ(Reader r);
    
    if (stat.code != OK)  
      //whatever
    
    d={}
    for i in theList:
      try:
        d[i] += 1
      except KeyError:
        d[1] = 1
    
    try {
     Integer.Parse(someString);
    }
    catch (ParseException pe) {
     //In this particular use case, if the string doesn't parse, 
     //I don't need to do anything. Logging a warning might be a
     //good idea, in some cases
    }
    
    beginDatabaseTransaction();
    try {
     doSomeDatabaseOperation();
    }
    catch (Exception e) {
     log.error(e); //log the original exception
     try {
      rollbackDatabaseConnection();
     }
     catch(Exception e2) {
      //You may ignore this one-off exception, though
      //I would strongly consider logging it
     }
     throw; //rethrow the original exception and let it propagate
    }