C# 如何自动重新引发异常
如果在try-catch块中包装对C# 如何自动重新引发异常,c#,asp.net,exception,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 except
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) {}
}
}
}
你是说像这样
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);
这就像使用普通语句一样简单
throw;
在相关的catch块中。请注意,这比执行抛出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;
}
}
}
}
您不能将普通异常更改为具有此行为。对此有特殊支持,您无法在C#中实现自己
ThreadAbortException是一个可以捕获的特殊异常,但它将在catch块结束时自动再次引发
“throw e”将把异常跟踪限制在这一行。@Greg-同上。永远不要显式抛出您没有创建的异常catch{throw;}
会更合适。@Greg那么如果你愿意,只要throw
。他在要求中没有具体说明这一点。不要因为他的要求含糊不清而否决我@在某些情况下,出于安全原因,您不希望将整个堆栈跟踪公开给消费代码。我不认为这是一个讨论何时抛出或包装异常或重置堆栈跟踪的好地方。每种情况都有充分的理由,这是一个完全不同的讨论。你是绝对正确的。我只是增加了一些深度,因为从表面上看,这是结构化异常处理最常见的滥用。经验不足的开发人员会看到这种模式,并在没有明确理解的情况下通过编写重复它。也许这个对话框可以引起人们的注意。我想他想这样做,即使你不这样做,异常也会自动被重新抛出,比如ThreadAbortException
@Mark:是的,你可能是对的,不过我认为这个解决方案是他能得到的最好的。ThreadAbortException
的性质是特殊的,因为CLR在管理线程时固有地使用它。你不能直接从C#复制这种行为。的确,但是throw
是一种实用的(只是稍微手动)解决方案。啊。我在别处看到了这句话,但误解为这意味着特别支持是我可以模仿的。