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
根据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
}
}