我对c#中的finally块有疑问。 我写了一个小样本代码:
public class MyType
{
public void foo()
{
try
{
Console.WriteLine("Throw NullReferenceException?");
string s = Console.ReadLine();
if (s == "Y")
throw new NullReferenceException();
else
throw new ArgumentException();
}
catch (NullReferenceException)
{
Console.WriteLine("NullReferenceException was caught!");
}
finally
{
Console.WriteLine("finally block");
}
}
}
class Program
{
static void Main(string[] args)
{
MyType t = new MyType();
t.foo();
}
}
据我所知,最后阻塞假设确定性地运行,无论是否抛出异常。 现在,如果用户输入“Y” - 抛出NullReferenceException,则执行移动到catch时钟,然后移动到finally块,如我所料。 但如果输入是其他东西 - 抛出ArgumentException。没有合适的catch块来捕获这个异常,所以我认为执行应该移动finally块 - 但它没有。有人可以解释一下为什么吗?
谢谢大家:)
答案 0 :(得分:6)
您的调试器可能正在捕获ArgumentException,所以它等待您在进入最终块之前“处理”它。运行没有附加调试器的代码(包括没有你的JIT调试器),它应该命中你的finally块。
要停用JIT,请转到选项>工具>调试>及时并取消选中托管
要调试没有连接的调试器,请在Visual Studio中转到调试>开始时无需调试(或 CTRL + F5 )
在程序结束时放置Console.ReadLine()以防止控制台在进入finally块后关闭也是有帮助的。
class Program {
static void Main(string[] args) {
MyType t = new MyType();
t.foo();
Console.ReadLine();
}
}
以下是您应该得到的输出:
抛出NullReferenceException? Ñ
未处理的例外情况: System.ArgumentException:值 不属于预期的范围。
在ConsoleSandbox.MyType.foo()中 病人:\文档\沙盒\控制台\控制台\康寿 e \ Program.cs:第17行
在 ConsoleSandbox.Program.Main(字符串[] ar:)在P:\ Documents \ Sandbox \ Console中 \ Console \ Console \ Program.cs:第31行
终于阻止
按任意键继续。 。
答案 1 :(得分:1)
您看到的是您的测试程序的工件。
如果您更改主要方法:
static void Main(string[] args)
{
try
{
MyType t = new MyType();
t.foo();
}
catch
{
// write something
}
}
然后您的foo()
将按预期行事。
如果没有尝试使用try / catch,整个程序就会被中止。