java 如何创建具有特定字段的例外?

uurv41yg  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(102)

我有一个异常类:

@NoArgsConstructor
public class ProductsException extends RuntimeException {

    private MyError error;

    public ProductsException(Exception e) {
        super(e);
    }
}
public class MyError {
    private final String errorCode;
    private final String message;
    private final String moreInfo;
    private final List<Errors> errors;

    public MyError(String errorCode, String message, String moreInfo, List<Errors> errors) {
        this.errorCode = errorCode;
        this.message = message;
        this.moreInfo = moreInfo;
        this.errors = errors;
    }

此异常是从服务类内部引发的,但我的客户端预期异常为:

{
    "personId" : "1",
    "code" : "1",
    "debugger" : "[
        //List
    ]"
    
}

所以我创建了一个新类

@Builder
public class CustomException extends ProductsException {

    private final String personId;
    private final String code;
    private final List<String> debugger;

}

在控制器中:

catch(ProductsException e) {
  throw CustomException.builder()
    .code(e.getErrorCode())
    .debugger(List.of(e.getError().getMessage()))
    .build();
}

这似乎不起作用,我得到了未捕获的异常。我怀疑我需要在构造函数中传递这些字段,但不确定确切需要做什么。
即使我执行public class CustomException extends RuntimeException,我如何将所有这些字段传递给super()
任何帮助都将不胜感激。

b09cbbtk

b09cbbtk1#

您不能将附加字段传递给超类。相反,您的类必须自己管理它们。例如:

public class CustomException extends ProductsException {

    private final String personId;
    private final String code;
    private final List<String> debugger;

    public CustomException(String personId, String code, List<String> debugger) {
        super();
        this.personId = personId;
        this.code = code;
        this.debugger = debugger;
    }

    public CustomException(String personId, String code, List<String> debugger, Exception cause) {
        super(cause);
        this.personId = personId;
        this.code = code;
        this.debugger = debugger;
    }

    public String getMessage() {
        return "Failed at " + personId + ", " + code + ", " + debugger;
    }

}

更改getMessage()以根据您的需要格式化消息。或者添加getter函数,以便其他代码部分可以根据需要接管格式化,例如,您的客户的格式化与日志文件的格式化不同。
我不知道为什么你会遇到未捕获的异常。在你的try/catch块中可能缺少一些东西,但是你显示的是你抛出的地方,而不是你捕获的地方。

相关问题