为什么我们最后使用块?
据我所知,以下两个代码片段将用于相同的目的。 为什么finally
阻止?
代码A:
try { /* Some code */ } catch { /* Exception handling code */ } finally { /* Cleanup code */ }
代码B:
try { /* Some code */ } catch { /* Exception handling code */ } // Cleanup code
- 如果你不处理的exception被抛出,会发生什么? (我希望你不会抓到
Throwable
…) - 如果你从try块内返回,会发生什么?
- 如果catch块引发exception会发生什么?
一个finally
块可以确保你退出这个块(以几种方式显式地中止整个过程),它会被执行。 这对确定性清理资源非常重要。
请注意(至less在Java中,也可能在C#中)也可以有一个try
块,没有catch
,但有一个finally
。 当try
块中发生exception时, finally
块中的代码会在exception处于较高位置之前运行:
InputStream in = new FileInputStream("somefile.xyz"); try { somethingThatMightThrowAnException(); } finally { // cleanup here in.close(); }
无论在try或catch块中发生了什么,您都可能希望将代码放在任意位置。
另外,如果您使用多个catch,并且您想要放置一些所有catch块通用的代码,这将是一个放置的位置 – 但是您不能确定try中的整个代码是否已经被执行。
例如:
conn c1 = new connection(); try { c1.dosomething(); } catch (ExceptionA exa) { handleexA(); //c1.close(); } catch (ExceptionB exb) { handleexB(); //c1.close(); } finally { c1.close(); }
最后总是得到执行,你的代码在catch之后可能不会。
即使我们的应用程序被强制closures,也会有一些我们必须执行的任务(如内存释放,closures数据库,释放锁等),如果在finally
块中写入这些代码行,它将执行是否抛出exception或不…
你的应用程序可能是一个线程的集合, Exception
终止线程,但不是整个应用程序,在这种情况下finally
更有用。
在某些情况下, finally
不会执行诸如JVM失败,线程终止等。
因为您需要执行该代码,而不pipe可能引发的任何exception。 例如,您可能需要清理一些非托pipe资源(“使用”构造编译为try / finally块)。
不pipe怎样,有时候你想执行一段代码。 是否抛出exception 然后一个finally
使用。
finally
总是执行,除非JVM被closures, finally
只是提供一个方法把清理代码放在一个地方。
如果你不得不把清理代码放在每个catch
块中,那就太乏味了。
如果catch块抛出任何exception,那么剩余的代码将不会执行,因此我们必须写finaly块。