如果我有一个程序,它调用的方法在抛出特定异常时必须终止,那么我是应该将该异常向上传递回main
以便它可以安全地返回,还是应该在函数中处理该异常并调用System.exit(-1)
下面是我在函数中处理它的一个例子:
public class MyClass{
public static void main (String[] args){
myFunction(args);
}
public static void myFunction(String[] args){
try{
if(args.length == 0)
throw Exception("Invalid Input");
}catch(Exception e){
System.out.println(e);
System.exit(-1);
}
}
}
下面是一个例子,说明了我传递它的意思:
public class MyClass{
public static void main (String[] args){
try{
myFunction(args);
}catch(Exception e){
System.out.println(e);
}
}
public static void myFunction(String[] args) throws Exception{
if(args.length == 0)
throw Exception("Invalid Input");
}
}
在这种情况下应该使用哪种方法?
发布于 2018-08-01 08:20:11
几乎没有理由调用System.exit
。也许如果有一些灾难性的情况,您想要立即停止JVM,很难想象会是什么情况。所以我要说的是,在没有特定需求的情况下,永远不要调用System.exit
。
在main
方法中设置一个try-catch
块,捕获Throwable
并记录它。这最小化了程序中其他地方的异常处理,并鼓励了一种快速失败的编程方式,这样异常就不会被吃掉和丢失。
或者,您可能有一个从shell脚本运行的小Java程序。您可以让main
方法抛出Exception
,并让shell脚本调用者将stderr
重定向到一个文件。但使用真正的记录器可以更好地控制滚动和清除等操作。
如果您担心会抛出一些无法记录的错误(可能我们内存不足,无法在不引起另一个out of memory错误的情况下进行记录),那么作为预防措施,除了让Java程序执行自己的记录之外,还可以将记录添加到调用方。
发布于 2018-08-01 14:59:51
这个问题可以用一种方式来回答,从本质上说,这不是一个主要基于意见的问题。
首先,考虑一下相关的问题"when should you throw an exception"?对此的correct answer是“当且仅当,另一种选择是无法建立post条件或维护不变量”。这提醒我们在方法post条件方面进行思考。您提供了一个解析命令行参数的方法示例。它应该有一个post条件“命令行参数有效”。因此,在命令行参数无效的情况下,该规则告诉我们该方法应该抛出异常,并且不需要终止。
其次,考虑为什么会有例外。有些编程语言没有它们(特别是C语言)。另一种方法是使用状态代码。异常的优点之一是,它们将检测问题(抛出异常)与决定在发生问题时做什么(捕获异常)分开。它们为更高级别的调用方法提供了一种“向上推送策略”的方法。因此,如果出现问题(例如,在您的示例中,无效的命令行参数),程序是否应该终止?这是一个政策问题,因此属于较高级别的方法,而不是较低级别的方法。同样的论点也适用于程序的所有级别:任何方法都不能被证明是终止程序,实施最极端的策略,因为它可以通过抛出异常来向上推动策略。唯一不能向上推送策略的方法是main
方法,因为它没有可以向上推送的调用方。这表明只有main方法才会导致程序终止。请注意,JVM是以这种方式运行的:即使虚拟机错误根本无法处理,并且应该导致程序终止,也会导致抛出VirtualMachineError
,而不是直接终止程序。
https://stackoverflow.com/questions/51623607
复制相似问题