有条件地强制执行异常处理

时间:2017-12-22 18:07:27

标签: java

我有一种方法,在某些情况下可能会抛出异常,但大部分时间都不会。我想要求任何调用此方法的人如果在" dangerous"条件,但不必担心它在" safe"条件。

public static boolean dangerousSituation; // set somewhere else

public sometimesDangerousMethod() throws MyException {
// some code 
// may throw MyException if dangerousSituation == true
// will never throw MyException if dangerousSituation == false
}

otherMethod() {
    dangerousSituation = false;
    sometimesDangerousMethod(); // shouldn't have to worry about MyException
                                  // if it can't possibly happen
    dangerousSituation = true;
    try {
        sometimesDangerousMethod(); // should be required to handle
                                      // MyException if it may possibly happen
    } catch(MyException e) {
        // handle MyException
    }
}

也就是说,当有且仅当dangerousSituation == true时,我想要有时候在一个尝试/捕获块有时候危险的方法()。

我之所以这样做是因为如果他们坚持安全的情况,我不想打扰开发人员进行异常处理。但是,当然,如果开发人员确实使用危险情况,编译器应该让他知道。

有没有办法在Java中获得此行为?

我曾考虑将有时危险的方法()分解为两种方法:一种是危险的,一种是安全的。但我不认为这是有道理的,因为这需要开发人员了解两种基本相同的方法。

4 个答案:

答案 0 :(得分:2)

您正在寻找的功能不存在。您可以将其拆分为两种方法,或者您的同事必须使用try-catch。对不起,但有时答案只是“不”。

答案 1 :(得分:2)

@mypetlion在很大程度上是准确的。 您还需要考虑以下几个选项:

  1. 是否可以在sometimesDangerousMethod()而不是otherMethod()内处理异常?如果是这样,那么您可以将日志记录/度量标准对象传递给方法内部的方法try/catch,并在发生此情况时记录错误消息或更新度量标准。这样,在没有发生异常的情况下,您不必担心try/catch

  2. 您可以将其分解为2个方法,例如提到的@mypetlion和一些组织,它可能是足够好的代码:

  3. `

    public class Solution {
      public static boolean dangerousSituation; // set somewhere else
    
      public void notDangerousMethod(){
        // will never throw MyException
      }
    
      public void dangerousMethod() throws MyException {
        // throws MyException 
      }
    
      public void sometimesDangerousMethod() throws MyException {
        if(dangerousSituation){
          dangerousMethod();
        } else {
          notDangerousMethod();
        }
      }
    
      public void otherMethod() {
        dangerousSituation = false;
    
        // Option 1:
        if(dangerousSituation){
          try{
            dangerousMethod();
          } catch(MyException e) {
              // handle MyException
          }
        } else {
          notDangerousMethod();
        }
    
        // Option 2:
        try {
            sometimesDangerousMethod(); // should be required to handle
                                        // MyException if it may possibly happen
        } catch(MyException e) {
            // handle MyException
        }
    
    }
    

    `

    根据SometimesDangerousMethod()的内容,这可能有点矫枉过正。如果它是一些非常简单的逻辑线,那么实现原始设计可能是值得的。我不认为开发人员会介意:)

答案 2 :(得分:0)

你错过了Exception这个词。您的代码不应抛出Exception,除非存在异常情况。正确设计的代码消耗您的代码仍然需要处理异常情况的可能性。

答案 3 :(得分:0)

您不必担心方法的用户不必担心例外情况。

如果您的方法因任何原因而失败,它应该声明异常(或使用未经检查的异常)并在异常失败时抛出异常。这正是例外情况。

所以我认为dangerousSituation实际上是一个非常危险的旗帜。在你提出的代码中,设置标志转换为“不要告诉我方法是否失败[因为我知道比方法的实现更好,不会有失败]”。

因此,不投掷的唯一原因可能是肯定会成功的方法。任何体面的Java开发人员都应该知道如何处理异常(通常是让它们传递到顶级,捕获并记录所有异常)。