如果在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) {}
}
}
}
答案 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);