如果抛出异常,会执行什么代码?

时间:2010-11-01 04:53:26

标签: c# logging exception-handling

try
{
    some code
}
catch()
{
    some code
}
finally
{
    some code
}

try
{
    some code
}
catch()
{
    some code
}
finally
{
    some code
}

我知道如果在第一个try块中抛出异常,那么将执行第一个finally块。第二个最终阻止怎么样?

此外,如果您想在出现异常时向用户显示消息,那么您应该在哪里编写该消息,以及如何显示该消息?

仅供参考,我最近在一次采访中被问到了这些问题,并且感到难过。

3 个答案:

答案 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 其他情况比较少(你的错误处理被破坏)