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

在Java中抛出异常的链接列表,java,exception-handling,Java,Exception Handling,我有一个函数,在执行可能引发异常的操作时循环。看起来像这样: public void myFunction() throws MyException { while(stuff) { try { DoSomething() // throws an exception } catch (Exception ex) { throw new MyException(some, stuff, of,

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

public void myFunction() throws MyException {
    while(stuff) {
        try {
            DoSomething() // throws an exception
        }
        catch (Exception ex) {
            throw new MyException(some, stuff, of, mine, ex);
        }
    }
}
导致异常的错误是可恢复的。它可能类似于单个update语句中的SQL错误,其中while循环执行一系列update语句。或者单个数据段中的解析错误,其中循环正在处理多个数据段。我需要进一步向上传递异常,以便程序的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;
}
我最初的想法(除了我没有看到这一点)是,异常可能是一个相当大的对象(包含stacktrace),我不希望存储太多异常

相反,我会在异常发生时构建一个错误参数/参数的列表,在循环完成后,抛出一个用该列表填充的自定义异常(如果该列表包含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);
    }
}
public void myFunction()引发自定义异常{
列表错误=新建ArrayList();
while(东西){
试一试{
DoSomething()//引发异常
}
捕获(例外情况除外){
添加(新的MyError(some,stuff,of,my,ex));
}
}
如果(errors.size()>0){
抛出新的CustomException(错误);
}
}

您真的需要抛出所有异常吗?您希望如何处理个别的、不相关的异常?一般来说,在这种情况下,系统只会报告错误并进行处理


如果是这样,您可能只想收集错误消息,并将它们添加到自定义的
异常
类中,然后抛出该异常。

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

如果这些异常彼此之间确实不相关,因此您无法利用
get/setCause()
,那么我宁愿将此信息收集在一个
MyException

例如


更新:以更简洁的方式准确地处理此方法。我会选择这样做:)

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

如果预期会出现错误,则从此类函数引发任何异常可能不是正确的处理方法。我建议返回所有发生的异常/错误的列表(数组),或者更好地为可以处理异常的函数提供一个错误处理程序对象。i、 e:

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

这还允许错误处理程序收集错误以将其呈现给用户,或者决定整个批处理操作因某些错误而无效,并抛出异常以尽早中止处理。

我认为您可以向该方法传递一些回调或侦听器,或者在类变量中设置,而不是像x4u那样抛出列表


在Java中已经有了一个接口:

现有函数签名返回void。你可以简单地返回失败对象的列表,或者其他一些收集成功和失败的结构,等等。@TREE我很确定这是一个示例,而不是实际的方法+1,这比我的更简洁。我修复了您的代码以声明
抛出CustomException
。哦,请注意,
Error
java.lang
中的一个现有类。您可能希望更改名称以避免混淆。错误类修改为MyError如果序列化了异常,则在反序列化中,MyError列表将为nullTrue。在这种情况下,我想问的不是(理论上)这种情况,但是,这绝对是需要记住的。除此之外,您是否在此处使用链接列表。有一个类
java.util.LinkedList
可以使用,因此您不必在item对象中编程它的功能(在本例中为
MyException
),我知道它。我不认为您可以在这种情况下使用它,因为需要抛出列表,并且LinkedList不是一次性的。我认为这种方法比@Brain Agnew answer更好,原因如下:1.错误处理程序在需要时为您提供不同的异常处理方法2。不再构建错误数组(或某种指示符),因为您正在处理发生的错误。
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 );
        }   
    }   
}