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

Java 有条件地强制执行异常处理,java,Java,我有一个方法,在某些条件下可能抛出异常,但大多数情况下不会。我想要求任何调用此方法的人捕获异常,如果他们在“危险”条件下调用它,但不必担心它在“安全”条件下 public static boolean dangerousSituation; // set somewhere else public sometimesDangerousMethod() throws MyException { // some code // may throw MyException if dangerous

我有一个方法,在某些条件下可能抛出异常,但大多数情况下不会。我想要求任何调用此方法的人捕获异常,如果他们在“危险”条件下调用它,但不必担心它在“安全”条件下

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
    }
}
也就是说,当且仅当危险情况==true时,我希望在TimesDangerousMethod()周围需要一个try/catch块

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

在Java中有什么方法可以实现这种行为吗


我曾考虑过将DangerousMethod()分为两种方法:一种是危险的,一种是安全的。但我不认为这有什么意义,因为这需要开发人员了解两种基本上做相同事情的方法

您正在寻找的功能不存在。您可以将其分为两种方法,否则您的同事将不得不使用try-catch。抱歉,但有时答案只是“不”。你没有抓住“例外”这个词的要点。除非出现异常情况,否则代码不应抛出异常。使用您的代码的正确设计的代码仍然需要处理异常情况的可能性。

@mypetlion在很大程度上是准确的。 还有一些其他的选择让你考虑是:

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

  • 您可以将其分为两种方法,如前面提到的@mypetlion,再加上一些组织,这可能是足够好的代码:

  • `

    `


    根据sometimesDangerousMethod()的内容,这可能有些过分。如果只是几行非常简单的逻辑,那么实现您的原始设计可能是值得的。我认为开发人员不会介意:)

    您不应该太担心方法的用户不得不担心异常

    如果您的方法可能因任何原因失败,它应该声明异常(或使用未检查的异常),如果确实失败,则抛出异常。这正是例外的原因

    所以我认为危险情况实际上是一个非常危险的标志。在您建议的代码中,设置标志将转换为“不要告诉我方法是否失败[因为我比方法的实现更清楚不会出现失败]”


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

    这听起来像是在尝试将运行时状态(即变量是
    true
    还是
    false
    )与编译时检查(即已检查的异常)混为一谈。这是行不通的:/I我建议您创建方法的“安全”和“不安全”版本。对我来说,这听起来像两个不同的函数。“这需要开发人员了解两个基本上做相同事情的方法”--与要求开发人员了解您的方法在危险情况下的实现细节相反?@Benitok这是我个人的观点,所以我没有在回答中包括它,但是我想说,对于另一个开发人员来说,意识到第二种方法的存在比他们理解什么构成了
    危险情况
    ,要合理得多。我建议创建一个名为Dexception的危险情况类,并在危险情况失败时抛出它。我认为OP理解这他们说在某些情况下,他们的代码/方法永远不会抛出异常。谢谢@OliverCharlesworth——我理解这一点,但这是一个糟糕的要求——如果该方法可能抛出异常,那么代码的用户需要处理它。如果我打开一个我知道存在的文件,那么我就不必担心
    IOException
    ,但是每个方法应该有两个版本吗?那将是一个非常糟糕的设计。在这种情况下,答案不是否定的。使用
    RuntimeException
    将允许调用方忽略任何异常处理,因此这是可能的。当然,这不是一个好的设计,也不是一个合适的解决方案,但这不是不可能的。是的,这是第三种选择。但这个答案基本上还是正确的——您不能用运行时信息通知编译时检查。
    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
        }
    
    }