为什么没有选项可以使用自定义消息重新抛出异常?

时间:2014-08-11 07:33:24

标签: java exception-handling

要自定义错误消息,我们需要执行以下操作

  • 抓住例外
  • 将异常包装到另一个异常
  • 重新抛出异常

相反,为什么没有办法只更改Exception错误消息并重新抛出它?

我知道这是一个基本问题,但很想知道你的意见。

举个例子:

    try
    {
        // Any operation which might throw NumberFormatException.
        int result = 1 / 0;

    } catch (NumberFormatException e)
    {
        // Observe that if I just throw by 'e' then I will get message as '/ by zero'
        throw e;

        // OR I wrap the exception (optional) and throw new exception with custom message.
        throw new NumberFormatException("<Custom Message> instead of '/ by zero'");

        // Instead, wouldn't it be easy if I could just overwrite the exception message of NumberFormatException?

        // below code isn't valid, but wondering why Java doesn't let me do this?
        e.setMessage("<Custom Message> instead of '/ by zero'");
        throw e;
    }

3 个答案:

答案 0 :(得分:3)

 catch (NumberFormatException e){
    e.setMessage("<Custom Message> instead of '/ by zero'");
    throw e;

 }

如果Java允许您这样做,这是一种处理异常的错误方法。现在您丢失了原始消息并丢失了异常的堆栈跟踪。这就是为什么没有任何意义让你设置消息,没有必要捕获并抛出相同的异常,只需抛出它并在上层处理它。

如果你想做一些你想做的事,你可以按照以下方式去做

catch(NumberFormatException e){
    throw new MyException("your message matched with the method" ,e);
}

在这种情况下,您可以看到,在添加邮件时,原始邮件和stackTrace都会保留。

答案 1 :(得分:0)

如果您可以更改异常消息,则可以编写一些真正的错误代码。异常是方法合同的一部分。它反映了代码深处发生的事情。

在那里沟通关于代码中更深层次出错的事情。更改此消息不是您的业务。您可以将消息抛出到其他可以处理/了解如何处理此异常的方法,或者如果您愿意,可以捕获异常并抛出自己的异常。

基本上,消息是异常的固有部分(如果您愿意,则不可变)。

写一些像

这样的东西也不难
catch(Exception e){
    throw new Exception("custom message" ,e);
}

哪一行短于:

catch(Exception e){
    e.setMessage('my custom message');
    throw e;
}

问问自己,如果你的工作是马的一个人,他必须向A人发送一封信给B,你读了这封信并意识到需要更新一些额外的信息。你会把这封信重写并放回信封里,或者你会写一个便条纸并把它贴在信封上吗?

答案 2 :(得分:0)

没有setMessage() meghod,你可以抛出不同的NFE实例,但原因除了原因:

catch (NumberFormatException e) {
    throw new NumberFormatException("<Custom Message> instead of '/ by zero'", e);
}

保留异常的上下文非常重要,因此堆栈跟踪对调用者尽可能有用。