【问题标题】:Catching Exceptions and Rethrowing捕获异常并重新抛出
【发布时间】:2012-05-04 00:17:41
【问题描述】:

我是 Java 领域的新手,但目前正在进行分配的评估。我想知道是否有办法在类函数中捕获异常并抛出另一个异常,这样调用类函数的函数就不需要知道抛出的第一个异常。

例如

public void foo() throws MasterException {
    try {
        int a = bar();
    } catch (MasterException e) {
        //do stuff
    }
}

public void bar() throws MasterException, MinorException {
    try {
        int a = 1;
    } catch (MinorException e) {
        throw new MasterException();
    }
}

我希望这个例子能解释我想要达到的目标。基本上我希望调用函数不知道MinorException

【问题讨论】:

  • 除了您将throws MinorException 保留在bar() 之外,这似乎您已经完成了您的要求。
  • 不需要在 bars throws` 子句中列出 MinorException。

标签: java exception throw


【解决方案1】:

bar 的声明中删除, MinorException,你就完成了。 我也会这样做:

throw new MasterException(e);

如果MasterException 有一个支持它的构造函数(它的标准支持,Exception 类支持)。

【讨论】:

  • 谢谢伙计,我来自 c/c++ 背景,从未真正使用过异常。
  • 例外是一种祝福和诅咒,恕我直言,主要是一种诅咒(当它们被检查时)。掌握重新扔掉它们的概念似乎是“掌握”它们的一个很好的步骤。
  • 是的,我一直被认为是 C++ 中的诅咒。
  • @esej:你能解释一下为什么抓和重投是件好事吗?我希望我没有劫持原来的问题。如果是,请道歉
  • @Kaushik 请忽略/忘记这一点。英语是我的第二语言,我试图说一些与你读到的完全不同的东西。
【解决方案2】:

当然。你想改变这一行:

public void bar() throws MasterException, MinorException

到这里:

public void bar() throws MasterException

其他一切都应该完全按照您的编写方式工作。

【讨论】:

    【解决方案3】:

    只需从 bar() 的 throws 子句中删除 MinorException。

    【讨论】:

      【解决方案4】:

      我会从 foo() 中删除 MasterException,因为你正在捕捉它,正如其他答案所说,MinorException from bar()。

      另外,如果 MasterException 或 MinorException 是 RuntimeException 的子类,则不需要声明它。参见例如http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

      【讨论】:

      • 我只是在脑海中编造了异常名称,我没有使用这些异常,这只是一个示例。
      【解决方案5】:
      1. 从方法foo()的声明中删除throws MasterException,原因很明显,MasterException已经准备好被捕获,所以无论如何都不会发生。

      2. 从方法bar()的声明中删除, MinorException

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2010-10-03
        • 2011-06-27
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 2014-08-18
        • 1970-01-01
        相关资源
        最近更新 更多