Java:异常处理程序

时间:2013-12-10 16:51:32

标签: java exception exception-handling

我有一个项目,其中包含以下列方式编写的异常处理:

父类具有所有异常处理逻辑。调用的类只抛出异常,调用者类处理适当的逻辑。

现在我面临调用类的问题会打开不同的东西,比如文件。这些文件在异常时没有关闭。

那么在这种情况下应该采用什么样的异常处理方式。

    class A
    {
    private void createAdminClient()
    {

        try
        {
            B b = new B();          
                b.getClinetHandler();
        }
        catch(CustomException1 e1)
        {
        }   
        catch(CustomException2 e1)
        {
        }   
        catch(CustomException3 e1)
        {
        }
        catch(CustomException4 e1)
        {
        }
    }
}

class B
{
    ................
    ................

    getClinetHandler() throws Exception
    {
        --------------------------      
        ---- open a file----------
        --------------------------
        ----lines of code---------
        --------------------------      

        Exceptions can happen in these lines of code.
        And closing file may not be called      

        --------------------------      
        ---- close those files----
        --------------------------

    }

}

4 个答案:

答案 0 :(得分:2)

你可以在try ... finally块中包装可能引发异常的代码:

getClientHandler() throws Exception {
    // Declare things which need to be closed here, setting them to null
    try {
        // Open things and do stuff which may throw exception
    } finally {
        // If the closable things aren't null close them
    }
}

这种方式异常仍然会出现异常处理程序,但finally块确保在发生异常时仍然会调用结束代码。

答案 1 :(得分:0)

使用finally块来完成最终任务。例如

    try
    {
        B b = new B();          
            b.getClinetHandler();
    }
    catch(CustomException1 e1)
    {
    }  
    finally{
       // close files
    }

来自doc

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

答案 2 :(得分:0)

我就是这样做的

try {
    //What to try
} catch (Exception e){
        //Catch it
    } finally {
                    //Do finally after you catch exception
        try {
            writer.close(); //<--Close file
        } catch (Exception EX3) {}
    }

答案 3 :(得分:0)

使用finally块来处理后处理执行(无论是成功还是失败)。像这样:

// Note: as Sean pointed out, the b variable is not visible to the finally if it 
// is declared within the try block, therefore it will be set up before we enter
// the block.
    B b = null; 

    try {
        b = new B();          
        b.getClinetHandler();
    }
    catch(CustomException1 e1) {
    } // and other catch blocks as necessary...
    finally{
        if(b != null)
            b.closeFiles() // close files here
    }

即使您finallythrow阻止returntry catch,也会始终执行finally阻止。

This answer提供了一个非常好的解释,说明{{1}}块在这种情况下是如何工作的,以及何时/如何执行,基本上进一步说明了我刚写的内容。