我有一个项目,其中包含以下列方式编写的异常处理:
父类具有所有异常处理逻辑。调用的类只抛出异常,调用者类处理适当的逻辑。
现在我面临调用类的问题会打开不同的东西,比如文件。这些文件在异常时没有关闭。
那么在这种情况下应该采用什么样的异常处理方式。
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----
--------------------------
}
}
答案 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
}
即使您finally
或throw
阻止return
或try
catch
,也会始终执行finally
阻止。
This answer提供了一个非常好的解释,说明{{1}}块在这种情况下是如何工作的,以及何时/如何执行,基本上进一步说明了我刚写的内容。