代码之家  ›  专栏  ›  技术社区  ›  Alex McLean catherine

C#不会捕获“嵌套”自定义异常[重复]

  •  0
  • Alex McLean catherine  · 技术社区  · 8 年前

    我试图捕捉“嵌套”或“封装”自定义错误( I504Error )在我的代码中。我知道这通常不是最佳实践,但它应该适用于我的用例,因为错误非常具体。我正在试着得到 try/catch 拦截以捕捉 I504错误 在我的 Main 方法,但它没有捕获它,即使它是从 尝试/抓住 块我的程序只是在抛出错误的地方停止。我做错了什么?

    // Custom Error Handler
    public class I504Error : Exception
    {
        public I504Error()
        {
        }
    }
    
    // Classes
    
    public abstract class AbstractIternetThing
    {
        public abstract void DoSomething();
    }
    
    public class IternetThing : AbstractIternetThing
    {
        public override void DoSomething()
        {
            // bunch of other stuff
            if (iternetThingWorkedProperly == false)
            {
                // Program stops here, doesn't get caught by the try/catch block in Program.Main()
                throw new I504Error();
            }
        }
    }
    
    // Main script
    class Pogram
    {
        static void Main(string[] args)
        {
            List<Task<AbstractIternetThing>> programThreads = new List<Task<AbstractIternetThing>>();
            IternetThing iThing = new IternetThing();
    
            try
            {
                for (int wantedThread = 0; wantedThread < 5; wantedThread++)
                {
                    Task<AbstractIternetThing> iThingTask = new Task<AbstractIternetThing>(() => iThing.DoSomething());
                    iThingTask.Start();
                }
            }
            // The Error should get caught here, but it doesnt?
            catch (I504Error)
            {
                // Do something else
            }
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Daniel A. White    8 年前

    这是因为你在一个 Task 它位于单独的异步执行路径上。考虑使用async await。然后编译器将重写代码,使其按预期工作。