try
{
some code
}
catch()
{
some code
}
finally
{
some code
}
try
{
some code
}
catch()
{
some code
}
finally
{
some code
}
我知道如果在第一个try块中抛出异常,那么将执行第一个finally块。第二个最终阻止怎么样?
此外,如果您想在出现异常时向用户显示消息,那么您应该在哪里编写该消息,以及如何显示该消息?
仅供参考,我最近在一次采访中被问到了这些问题,并且感到难过。
答案 0 :(得分:6)
将此代码复制并粘贴到编辑器中。然后玩它,取消注释和重新评论各种线条。然后编译并运行代码。继续这样做,直到你知道关于它的一切非常舒服。当你发现所有这些令人困惑的问题时,我建议你这样做,这些问题只是基于流量控制。这就是你学习编程流程控制的方法。
try
{
Console.WriteLine("try1");
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
catch(ArgumentNullException e1)
{
Console.WriteLine("catch1");
Console.WriteLine(e1.ToString());
// throw;
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
catch(Exception e1a)
{
Console.WriteLine("catch1a");
Console.WriteLine(e1a.ToString());
// throw;
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
finally
{
Console.WriteLine("finally1");
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
try
{
Console.WriteLine("try2");
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
catch(ArgumentNullException e2)
{
Console.WriteLine("catch2");
Console.WriteLine(e2.ToString());
// throw;
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
catch(Exception e2a)
{
Console.WriteLine("catch2a");
Console.WriteLine(e2a.ToString());
// throw;
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
finally
{
Console.WriteLine("finally2");
// throw new ArgumentNullException();
// Console.WriteLine(((string)null).Length); // Will also throw exception
}
答案 1 :(得分:2)
在你编写的代码中,因为它们是两个不同的try块(即一个不包含在另一个中。)它们都将被尝试,第二个在第一个finally块运行之后。第二个最终块也将运行。
第二个是情境依赖的,通常,您希望尽可能远离用户。你希望你的程序是一个管家,安静,不在路上,但是当你需要它时。如果是我,我可能会悄悄地记录问题,然后以最可靠的方式继续,除非这是一个大问题,你需要通知用户,例如“我的ftp客户端无法找到网络连接。”如果是这种情况,并且您使用的是C#,那么我建议您查看此页面:http://msdn.microsoft.com/en-us/library/system.windows.forms.messagebox.aspx
答案 2 :(得分:1)
*当我说程序爆炸时,应用程序死掉并引发符文时间异常,因为它没有被捕获,也没有执行进一步的代码。
try
{
some code1 //always executes this, on exception goto code2
}
catch()
{
some code2 //if exception was caught do this, if exception occurs in this code program blows up
}
finally
{
some code3 //always executes this, if exception happens here, program blows up
}
try
{
some code4 //if program has not blown up at this point, execute this. on exception goto code 5
}
catch()
{
some code5 // if exception was caught do this. if exception occurs in this code, program blows up.
}
finally
{
some code6 //if program has not blown up by now, always do this.
}
公共代码路径是: 1-3-4-6发现没有例外 和 1-2-3-4-5-6如果在1& 4 其他情况比较少(你的错误处理被破坏)