首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在主函数或调用层次结构中的较低级别出现致命异常后退出

在主函数或调用层次结构中的较低级别出现致命异常后退出
EN

Stack Overflow用户
提问于 2018-08-01 07:59:23
回答 2查看 173关注 0票数 3

如果我有一个程序,它调用的方法在抛出特定异常时必须终止,那么我是应该将该异常向上传递回main以便它可以安全地返回,还是应该在函数中处理该异常并调用System.exit(-1)

下面是我在函数中处理它的一个例子:

代码语言:javascript
复制
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);
          }
     }
 }

下面是一个例子,说明了我传递它的意思:

代码语言:javascript
复制
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");
     }
 }

在这种情况下应该使用哪种方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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程序执行自己的记录之外,还可以将记录添加到调用方。

票数 0
EN

Stack Overflow用户

发布于 2018-08-01 14:59:51

这个问题可以用一种方式来回答,从本质上说,这不是一个主要基于意见的问题。

首先,考虑一下相关的问题"when should you throw an exception"?对此的correct answer是“当且仅当,另一种选择是无法建立post条件或维护不变量”。这提醒我们在方法post条件方面进行思考。您提供了一个解析命令行参数的方法示例。它应该有一个post条件“命令行参数有效”。因此,在命令行参数无效的情况下,该规则告诉我们该方法应该抛出异常,并且不需要终止。

其次,考虑为什么会有例外。有些编程语言没有它们(特别是C语言)。另一种方法是使用状态代码。异常的优点之一是,它们将检测问题(抛出异常)与决定在发生问题时做什么(捕获异常)分开。它们为更高级别的调用方法提供了一种“向上推送策略”的方法。因此,如果出现问题(例如,在您的示例中,无效的命令行参数),程序是否应该终止?这是一个政策问题,因此属于较高级别的方法,而不是较低级别的方法。同样的论点也适用于程序的所有级别:任何方法都不能被证明是终止程序,实施最极端的策略,因为它可以通过抛出异常来向上推动策略。唯一不能向上推送策略的方法是main方法,因为它没有可以向上推送的调用方。这表明只有main方法才会导致程序终止。请注意,JVM是以这种方式运行的:即使虚拟机错误根本无法处理,并且应该导致程序终止,也会导致抛出VirtualMachineError,而不是直接终止程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51623607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档