在 Java 中抛出异常的链接列表

2022-09-02 09:56:04

我有一个函数,它在执行可能引发异常的事情时循环。看起来像这样:

public void myFunction() throws MyException {
    while(stuff) {
        try {
            DoSomething() // throws an exception
        }
        catch (Exception ex) {
            throw new MyException(some, stuff, of, mine, ex);
        }
    }
}

导致异常的错误是可恢复的。它可以类似于单个更新语句中的 SQL 错误,其中 while 循环执行一系列更新语句。或者,单个数据片段中的解析错误,其中循环正在处理多条数据。我需要将异常进一步向上传递,以便程序的GUI部分可以处理它,处理它并将错误传递给用户。但我不想在这个特定函数中杀死循环。它正在做的其他事情可能不是无效的。导致异常的错误对函数可能不是致命的。

所以我的问题是:构建自定义异常的链接列表(其中每个异常都是一个节点,并且抛出的异常是列表的头部),然后在循环完成后抛出列表的头部(如果有)是否是一种可接受的做法?

有没有人见过这样做?有谁能想到这样做的任何潜在问题?有谁能想到其他更好的方法来处理根本问题:需要放弃多个不相关的异常,直到它完成才退出函数?

下面是如何非常简单地实现链接和抛出的示例:

public void myFunction() throws MyException {
    MyException head = null;
    while(stuff) {
        try {
            DoSomething() // throws an exception
        }
        catch (Exception ex) {
            MyException tmp = new MyException(some, stuff, of, mine, ex);
            tmp.next(head);
            head = tmp;
        }
    }
    if(head != null)
       throw head;
}

答案 1

我的最初想法(除了我没有看到这个)是异常可能是一个相当大的对象(包含堆栈跟踪),我宁愿存储很多。

相反,我会在发生异常时构建一个错误参数/参数的列表,并在循环完成后,抛出一个用此列表填充的自定义异常(如果列表包含超过0个元素)。这似乎是处理这种情况的更易于管理的方式。

public void myFunction() throws CustomException {
    List<MyError> errors = new ArrayList<MyError>();
    while(stuff) {
        try {
            DoSomething() // throws an exception
        }
        catch (Exception ex) {
            errors.add(new MyError(some, stuff, of, mine, ex));
        }
    }
    if (errors.size() > 0) {
       throw new CustomException(errors);
    }
}

答案 2

你真的需要抛出所有的异常吗?您希望如何处理个别的、不相关的异常?通常在这种情况下,系统只会报告错误并完成。

如果是这样,您可能只想收集错误消息并将其添加到自定义类并引发该类。Exception


推荐