gpt4 book ai didi

java - 如何为多个异常实现包装器?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:04:05 25 4
gpt4 key购买 nike

我有一些模块,每个模块都包含一些我想从持久文件中解析的模型。

当我读取一个文件时,我不知道哪个模块能够解析它,这就是为什么我尝试使用我的第一个模块的解析器来解析它。如果失败,我会尝试使用第二个模块的解析器并继续,直到我尝试了所有解析器。解析器可以以多个异常(Exception 类的不同子类型)或解析的模型对象(ModelBase 类的不同子类型)的形式返回信息。

如果没有一个解析器成功,我想将所有给定的异常包装成一个大异常,抛出它并在我的应用程序代码中的某个地方捕获它(以新的大异常的形式),在那里我可以处理问题(例如向用户显示所有解析问题和堆栈跟踪,以某种方式处理它们等)。

我的伪代码:

ModelBase getModelOrBigException(File file)
throws MyBigException {

List<Exception> exceptions = new ArrayList<>();
for (Module module : myModules){
try {
ModelBase model = module.parse(file);
return model;
}
catch (ParsingException1 p1) { exceptions.add(p1); }
catch (ParsingException2 p2) { exceptions.add(p2); }
}
throw new MyBigException(exceptions);
}

我要调用代码

void openFilesHandler(){

//... selecting file

try {
process(getModelOrBigException(file));
} catch (MyBigException e) {
// process the sub-exceptions or show them to user or print stacktraces of all sub-exceptions or show sub-exceptions by type etc
}
}

显然,如果我捕捉到 MyBigException,我将无法默认调用 getStackTrace()、getMessage()、getLocalizedMessage() 之类的方法,除非我实现与此类似的异常类:

class MyBigException extends Exception {

public MyBigException(Exception e1, Exception e2, ..., Exception eN){
super(e1, e2, ..., eN); // This is not possible, only one argument is acceptable
}
}

或对此:

class MyBigException extends Exception {

List<Exception> exceptions = new ArrayList<>();

public MyBigException(List<Exception> exceptions){
super(exceptions); // This is not possible, list or array of exceptions is not allowed here
}
}

问题:

我应该如何创建一个新类型的异常,它可以存储多个异常并支持原始异常类的方法?当我这样做时:

myBigException.printStackTrace();

或者这个:

myBigException.getMessage();

我想打印/获取所有存储的异常的所有堆栈跟踪。我应该将所有给定的异常传递给 super() 方法吗?

有没有比上面的解决方案更好的解析方案呢?

最佳答案

I want to print/get all stacktraces of all stored exceptions. Should I pass all given exceptions to super() method?

如果你想打印所有堆栈跟踪或异常消息,你就快完成了,你需要添加更多位,如下所述:

(1) 内部 MyBigException , 创建构造函数 MyBigException(List<Exception> exceptions, String exeptionMessage)并调用super(exeptionMessage);

(2) 覆盖 printStackTrace()在你的MyBigException并遍历 List<Exception>并调用printStackTrace()在每个异常对象上。

同样可以引用下面的代码:

MyBigException类:

public class MyBigException extends Exception {

private List<Exception> exceptions = new ArrayList<>();

public MyBigException(List<Exception> exceptions, String exeptionMessages){
//call super and pass message
super(exeptionMessages);
this.exceptions = exceptions;
}

public void printStackTrace() {
for(Exception exception : exceptions) {
exception.printStackTrace();
}
}
}

getModelOrBigException()代码:

ModelBase getModelOrBigException(File file)
throws MyBigException {

List<Exception> exceptions = new ArrayList<>();

//Capture exception messages as well using StringBuilder
StringBuilder exceptioMessages = new StringBuilder();
for (Module module : myModules){
try {
ModelBase model = module.parse(file);
return model;
}
catch (ParsingException1 p1) {
exceptions.add(p1);
exceptioMessages.append("YOUR MESSAGE FOR ParsingException1;");
}
catch (ParsingException2 p2) {
exceptions.add(p2);
exceptioMessages.append("YOUR MESSAGE FOR ParsingException2;");
}
}
throw new MyBigException(exceptions, exceptioMessages.toString());
}

关于java - 如何为多个异常实现包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com