C#中的Throw语句被最后一个Catch捕获

3

我想知道我对 Exception 的理解是否不正确。我有以下代码:

try
{
   // ... code calls a function which throws a UASException()
}
catch (UASException ex)
{
    throw;
}
catch (Exception ex)
{
    throw new UASException("An unknown error has occured", ex);
}

现在,当我重新抛出 UASException 时,它被下面的 Catch 捕获了,这样做正确吗?我认为它应该返回到调用代码并重新抛出 UASException。我可能错过了什么?

我建议你在try块中写入"throw new UASException("An unknown error has occured");"并运行代码。 - bit
1
代码本身应该可以正常工作。我认为你还缺少其他东西。 - Bogdan Beda
假设在 try 块中抛出的异常是 UASException,它将被重新抛出并且永远不会到达第二个 catch 块。如果您的经验不同,则很可能在代码中遇到了一些直接进入第二个 catch 块的不同异常。 - decPL
1个回答

2
不,它不会。只会选择一个异常处理程序(与异常类型最匹配的那个)。您可以轻松地尝试一下,但是...
示例:以下代码输出"Catch 1"而不是"Catch 2",这就是我所说的。无论在catch块内是否发生异常,都只执行一个catch。如果要在catch块中捕获异常,需要嵌套catch块。
using System;
using System.Collections.Generic;
using System.Text;

namespace CSharp
{
    public class Class1
    {
        public static void Main(string[] args)
        {
           try
           {
              throw new ArgumentException("BANG!");
           }
           catch (ArgumentException)
           {
               Console.WriteLine("Catch 1");
               throw;
           }
           catch
           {
               Console.WriteLine("Catch 2");
           }
        }
    }
}

你说得对,这正是我认为它应该工作的方式。看起来VS2013与之前的版本略有不同。 - Jamie
不,它并不会。仅仅因为它在编辑器中停在某一行以让你调试,并不意味着控制流程有所不同。这将使大多数使用最新.NET框架的.NET应用程序无法使用。它可能会在那里停止,因为在您代码的更高级别上未捕获异常。但是,“Catch 2”块永远不会执行,因为“Catch 1”块中有一个throw。这根本不是事实。 - Thorsten Dittmar
我认为你误解了我的评论,这只是不同版本的VS之间的视觉呈现差异,而不是代码执行方式上的差异。我期望VS会通过异常跳回到调用函数,但它没有这样做。也许我只是老了,有些困惑。无论如何,如果没有这篇文章,我可能仍然会摸索。 - Jamie
啊,我明白了。实际上,在以前的版本中,它会在发生错误的那行停止,是吗? - Thorsten Dittmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接