我正在自学C#,我正在研究尝试,捕获并最终。我正在使用的书正在讨论finally块是如何运行的,无论try块是否成功。但是,即使最终没有,也不会运行在catch块之外编写的代码?如果是这样,终于有什么意义呢?这是本书提供的示例程序:
class myAppClass
{
public static void Main()
{
int[] myArray = new int[5];
try
{
for (int ctr = 0; ctr <10; ctr++)
{
myArray[ctr] = ctr;
}
}
catch
{
Console.WriteLine("Exception caught");
}
finally
{
Console.WriteLine("Done with exception handling");
}
Console.WriteLine("End of Program");
Console.ReadLine();
}
}
答案 0 :(得分:4)
这些是finally
有用的场景:
try
{
//Do something
}
catch (Exception e)
{
//Try to recover from exception
//But if you can't
throw e;
}
finally
{
//clean up
}
通常您尝试从异常中恢复或处理某些类型的异常,但是如果您无法恢复,则不会捕获特定类型的异常,而是向调用者抛出异常,但是finally
块被执行反正。
另一种情况是:
try
{
//Do something
return result;
}
finally
{
//clean up
}
如果您的代码运行正常并且没有抛出异常,您可以从try
块返回并释放finally
块中的所有资源。
在这两种情况下,如果您将代码置于try
之外,则永远不会执行。
答案 1 :(得分:1)
finally块执行在任何一种情况下都需要运行的代码。例如,您经常重新抛出异常或以其他方式转到其他代码。如果资源的清理代码不在finally块中,则不会执行。您也可以将此代码放在catch块中,但无论如何您都会在try块之后重复代码。
答案 2 :(得分:0)
finally块非常有用,因为它允许您进行资源清理,否则如果您遇到异常则不会发生。
e.g。 (伪)
try {
open socket
use socket
}
// note: no catch for any socket exceptions
finally {
delete socket // always executed
}
答案 3 :(得分:0)
finally块的重点是包装你开始的东西。假设你在try块中打开了一个缓冲区,你应该在finally中关闭它。这是必要的,这样即使发生异常并且您从try中退出,资源也会正确关闭。
try
{
//Do Something
}
catch
{
//Catch Something
}
finally
{
//Always Do This
}
很多时候,catch语句中的代码会重新抛出异常或者中断当前函数。如果你没有最终阻止,&#34;总是这样做&#34;如果catch语句中的代码发出一个返回或抛出一个新的异常,则调用不会执行。
答案 4 :(得分:0)
这是一个简单的例子,显示写在catch块之外的代码无论如何都不会运行,即使它最终还没有!
URLClassLoader loader = new URLClassLoader(new URL[]{new URL("jar:file:/home/myapp/plugins/dateplugin.jar!/")}, ClassLoader.getSystemClassLoader());
MyInterface pluginClass = (MyInterface )loader.loadClass("com.mypackage.MyClass").newinstance();
,输出
最后
钓到
请阅读MSDN