【问题标题】:Is it possible to to catch all possible errors/exception?是否可以捕获所有可能的错误/异常?
【发布时间】:2012-07-12 09:57:09
【问题描述】:

我有一个包含许多类的 Java Swing 程序。我确实在需要的地方使用了 try-catch,但没有在其他地方使用。我还有一个记录器类,它在捕获到异常时写入文件。它打印出堆栈跟踪和消息。

我希望能够记录每个异常,但又不会到处都放 try-catch。这可能吗?

-- 编辑(我的主要方法)--

public class Bacon extends Thread implements UncaughtExceptionHandler {
    public static Bacon instance = null;
    private JFrame main;

    private Bacon() {
        main = new JFrame("Bacon");
        main.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        main.addWindowListener(new WindowEventHandler());
        setLAF();
        main.setSize(Constants.MAIN_DIMENSION);
        main.setLocationRelativeTo(null);
        main.setExtendedState(JFrame.MAXIMIZED_BOTH);
        main.setIconImage(getIcon());
        setUserName();
        setUncaughtExceptionHandler(this);

        main.setJMenuBar(Menu.getInstance());
        main.setContentPane(getMainPanel());
        main.setVisible(true);
    }

    public static Bacon getInstance() {
        if(instance == null)
            instance = new Bacon();

        return instance;
    }

    private JPanel getMainPanel() {
        JPanel main = new JPanel(new BorderLayout());

        main.add(Tabs.getInstance(), BorderLayout.CENTER);
        main.add(StatusBar.getInstance(), BorderLayout.SOUTH);

        return main;
    }

    .
    .
    .
    .
    .
    .
    .

    public static void main(String[] args) {
        try {
            getInstance();
        } catch (Throwable t) {
            ErrorLogging.log(t.getStackTrace(), t.getMessage());
        }
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        ErrorLogging.log(e.getStackTrace(), e.getMessage());
    }
}

【问题讨论】:

    标签: java swing exception try-catch


    【解决方案1】:

    你需要处理你不想让程序崩溃的异常,否则你可以在你的 main 方法中 catch(Throwable)。

    【讨论】:

    • 不是最好的方法。看看 Runtime 类的 setUncaughtExceptionHandler 方法!
    • 这将使您能够记录它们,但它不能代替他所要求的“到处放 try-catch”,它们仍然需要被捕获和正确处理。
    • @RockyTriton 我在我的 main 方法中放了一个 try catch,它成功地捕获了在该特定类中发生的所有错误,但是如果在其他地方抛出异常,它不会被捕获和记录。
    • 从哪里调用其他类?它们是从事件线程中调用的吗?
    • IMO,设置一个 UncaughtExceptionHandler 回答了他的问题“我希望能够记录每个异常,但又不把 try-catch 放在任何地方。这可能吗?”。此外,应在他的代码中的某处捕获和处理已检查的异常。编译器将强制执行此操作。至于未经检查的(RuntimeExceptions),这不是必需的。查看 Joshua Bloch 的 Effective Java,第 2 版,第 9 章,第 58 项,以获取有关此方面的建议。
    【解决方案2】:

    可能,不建议。

    您可以让每个方法都抛出一个Exception,并且每个调用该方法的方法也必须抛出一个。

    拥有这些 try catch 块的目的是让您可以缩小问题的确切位置。它们旨在帮助您,而不是伤害您。

    【讨论】:

      【解决方案3】:

      绝对!

      查看 Thread 类的方法 setDefaultUncaughtExceptionHandler。

      Thread.setDefaultUncaughtExceptionHandler

      【讨论】:

      • 我尝试实现 UncaughtExceptionHandler 并扩展 Thread,然后使用 setUncaughtExceptionHandler,但我无法成功记录另一个类中发生的任何错误。我在原始帖子中发布了我的主要 .java 类的一个小 sn-p。如果您还需要什么,请告诉我。
      • 您不必扩展 Thread 来实现 UncaughtExceptionHandler。您可以创建一个匿名类。 setUncaughtExceptionHandler 是一个静态方法,你应该可以传入一个匿名类,并且只记录传递给该方法的 throwable。
      • 静态方法中是否可以有非静态类?我试过了,日食不会让我。这是我的主要内容,其中包含 setUncaughtExceptionHandler。 pastebin.com/CiwHeET9
      • 抱歉,我给出了错误的方法。它是 setDefaultUncaughtExceptionHandler。那个是静态的。它应该从任何线程捕获所有未捕获的异常。但是根据文档,它在线程死亡之前被调用。不确定这是否是您想要的行为。
      • 请记住,setUncaughtExceptionHandker 只能在同一个线程组中工作,否则这是一个很棒的解决方案
      【解决方案4】:

      您捕获的内容与您的 try 封装的一样多,因此在您的 main 方法中放置一个周围的 try 块并 catch(Throwable) 以确保您捕获所有可以抛出的内容。

      通常最好在异常发生时单独处理它们。

      【讨论】:

      • “最好在异常发生时单独处理它们。” - 我认为这是一个糟糕的建议。最好的做法实际上取决于具体情况。例如,让异常传播到可以正确处理它们的点通常会更好。
      • @StephenC 你不同意比在 main 方法中捕获所有内容更好的想法是在异常发生时捕获和处理异常?
      • 我相信这两种选择都不是更好的选择,而且还有其他选择。这使您的建议过于简单化,因此很糟糕。
      • @StephenC 已编辑以反映并非总是更好的想法这一事实。我确实提交了通常它是。
      • @StephenC,我尝试在 main 方法中放置一个 try-catch。它能够捕获该类中发生的所有错误,但如果在其他地方抛出异常,则不会记录该异常。我已经在原始帖子中发布了我上面代码的一小部分,如果您需要其他任何内容,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 2012-02-16
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多