簡體   English   中英

如何在 Java 中設置異常消息?

[英]How can I set the message on an exception in Java?

我想設置自定義異常消息。 但是,我不確定如何做到這一點。 我需要創建一個自定義異常類還是有更簡單的方法?

大多數標准異常類都提供了一個接受消息的構造函數,例如:

public UnsupportedOperationException(String message) {
    super(message);
}

上面的類只是簡單地調用了它的父類的構造函數,它又調用了它的父類的構造函數,以此類推,最終達到:

public Throwable(String message) {
    ...
}

如果您創建自己的異常類,我認為遵循此約定是個好主意。

您只能在創建異常時設置消息。 這是一個示例,如果您想在創建后設置它。

public class BusinessException extends RuntimeException{

    private Collection<String> messages;

    public BusinessException(String msg){
        super(msg);
    }


    public BusinessException(String msg, Exception cause){
        super(msg, cause);
    }


    public BusinessException(Collection<String> messages){
        super();
        this.messages= messages;
    }


    public BusinessException (Collection<String> messages, Exception cause){
        super(cause);
        this.messages= messages;
    }

    @Override
    public String getMessage(){
        String msg;

        if(this.messages!=null && !this.messages.isEmpty()){
            msg="[";

            for(String message : this.messages){
                msg+=message+",";
            }

            msg= StringUtils.removeEnd(msg, ",")+"]";

        }else msg= super.getMessage();

        return msg;
    }

}

好吧,如果 API 提供了適合您需要的異常(例如 IllegalArgumentException),只需使用它並在構造函數中傳遞您的消息。

最好的方法是包裝異常。

try {
    my code that throws E;
} catch (final E e) {
    throw new MyE("my message", e);
}

Exception 類(它的父類,實際上是 Throwable)在其構造函數中將消息作為參數:

throw new Exception("message")Exception("message", innerException);

Exception類接受String自定義消息,就像(據我所知)所有派生類一樣。

所以:不,您不需要創建自定義類。 現有的例外之一可能涵蓋了您的案例(閱讀他們的描述以找出哪個)。 如果這些都不是真正令人滿意的,那么您可以創建Exception的擴展(或RuntimeException等)並維護自定義消息構造函數。

試試這個代碼:

try{
    throw new Exception("Test String");
}
catch(Exception ex){
    System.out.println(ex.getMessage());
}

另一種變體

public class MyCustomExceptionWithoutMessageInConstructor extends IllegalArgumentException {
    private static final String ERROR_MESSAGE = "terrible error";

    public MyCustomExceptionWithoutMessageInConstructor() {
        super(ERROR_MESSAGE);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM