如何自动重新引发异常

时间:2010-04-08 20:00:23

标签: c# asp.net exception

如果在try catch块中包含对HttpResponse.End的调用,ThreadAbortException将自动重新引发。我假设即使你将try catch块包装在try catch块中也是如此。

我怎样才能完成同样的事情?我没有这方面的实际应用程序。

namespace Program
{
    class ReJoice
    {
        public void End() //This does not automatically re-raise the exception if caught.  
        {
            throw new Exception();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) {}
        }
    }
}

3 个答案:

答案 0 :(得分:7)

您无法更改普通例外以获得此行为。 ThreadAbortException对此有特殊支持,您无法在C#中实现自己。

  

ThreadAbortException是一个可以捕获的特殊异常,但它会在catch块的末尾自动再次引发。

答案 1 :(得分:4)

就像使用普通throw语句一样简单。

throw;

在相关的catch区块中。请注意,这比执行throw e;更有利,因为它在异常点保留调用堆栈。

当然,这可能不是你想要的自动化,但不幸的是,这是不可能的。这几乎是你能得到的最好的解决方案,而且我认为还很简单。 ThreadAbortException在CLR中很特殊,因为它几乎是线程管理中固有的。

对于你的程序,你会有类似的东西:

namespace Program
{
    class ReJoice
    {
        public void End()
        {
            throw new Exception();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) 
            {
                throw;
            }
        }
    }
}

答案 2 :(得分:1)

你的意思是这样吗?

namespace Program
{
    class ReJoice
    {
        public void End() //This does not automatically re-raise the exception if caught.  
        {
            throw new Exception();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) {
               throw e;
            }
        }
    }
}

编辑:它不会重新引发异常,因为“catch”的含义是处理异常。作为x.End()的调用者,您需要在发生异常时执行此操作。通过捕获异常并且不执行任何操作,您说要忽略该异常。在catch块中,您可以显示一个消息框,或记录错误,完全终止应用程序,或通过包装异常重新抛出包含其他信息的错误:

throw new Exception("New message", e);