在Java中抛出一个链接的例外列表

时间:2010-02-04 20:40:52

标签: java exception-handling

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

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;
}

7 个答案:

答案 0 :(得分:16)

我的初步想法(除了我没有看到这个)是一个异常可能是一个非常大的对象(包含堆栈跟踪),我更喜欢来存储它们中的很多

我会在异常发生时构建错误参数/参数的列表,并在完成循环后,抛出用此列表填充的自定义异常(如果列表包含多于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);
    }
}

答案 1 :(得分:3)

你真的需要抛出所有例外吗?您如何期待处理个别的,无关的例外情况?通常在这种情况下,系统只会报告错误并完成。

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

答案 2 :(得分:3)

如果这些例外情况确实彼此无关,那么您无法从get/setCause()获益,那么我宁愿在一个MyException中收集这些信息。

E.g。

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

更新: Brian以更整洁的方式处理这种方法。我会选择这样做:)

答案 3 :(得分:2)

如果预计会出现错误,实际上抛出此类函数的任何异常可能不是处理此问题的正确方法。我建议要么返回发生的所有异常/错误的List(Array),要么更好地为可以处理异常的函数提供错误处理程序对象。即:

public interface ErrorHandler
{
    public void handleError( Throwable ex /*, add some context info */ );
}

public void myFunction( ErrorHandler eh )
{   
    while(stuff) {   
        try {   
            DoSomething() // throws an exception   
        }   
        catch (Exception ex) {
            if( eh != null )
                eh.handleError( ex );
        }   
    }   
}   

这也让错误处理程序收集错误以将它们呈现给用户,或者由于某些错误而确定整个批处理操作已经变为无效并且抛出它自己的异常以提前中止处理。

答案 4 :(得分:1)

如果DoSomething();引发的异常可能导致同一方法抛出另一个异常;这可能是个问题。换句话说,如果DoSomething();抛出异常因为你没有处理前一个异常,那么可能会有不必要的错误需要处理。

答案 5 :(得分:1)

我认为你可以将一些回调或监听器传递给该方法,或者设置一个类变量,而不是抛出一个列表,就像x4u那样。

在Java中,已有一个接口:java.beans.ExceptionListener

答案 6 :(得分:0)

IMO,异常应该是您处理错误的最后一个资源。如果可能的话应该避免。因此,您可能希望将错误描述(创建错误代码,传递消息或有意义的内容)传递给GUI,而不是异常本身。