我如何判断异常是否是故意抛出的

本文关键字:故意 是否是 异常 何判断 判断 | 更新日期: 2023-09-27 18:21:20

我想捕捉一个异常,以判断是我故意抛出错误还是运行时错误(对象而不是对象的实例)。

try
{
    throw new Exception("throw this", "these can be many possible values");
}
catch (System.Exception ex)
{
    if (IThrew) // <--- how can i tell if i threw or not?
    {
        exReport = "one thing"; // <--- Should go in here in this example.
    }
    else
    {
        exReport = "another thing";
    }
    throw new FaultException<ExceptionReport>(exReport, new FaultReason(ex.Message), new FaultCode("Receiver"));
}

澄清:

我需要记录所有异常,然后在最后将它们显示在异常报告(异常数组)中。这是我必须遵循的模式的一部分。(所以请不要要求我换一种方式)。

我让它都工作得很好,它输出的东西像:

...
<soap:Detail>
<ows:ExceptionReport>
 <Exception exceptionCode="…" locator="…">
  <ExceptionText>…</ExceptionText>
 </Exception>
 <Exception exceptionCode="…" locator="…">
  <ExceptionText>…</ExceptionText>
 </Exception>
</ows:ExceptionReport>
</soap:Detail>
...

问题是,当我的ExceptionReport中已经有一些错误时,就会发生运行时错误。

但我意识到我在这件事上走错了路。。。正如Gary提到的。。。我不应该使用异常作为流控制。

我如何判断异常是否是故意抛出的

使用不同的异常。给它自己的捕获条款。

为自己的异常使用一种特殊类型的异常并进行检查。

否则,您将不得不检查堆栈跟踪,看看源是否是您的程序集之一,这既不美观又不可靠。

您无法告诉抛出异常的原因

所能做的就是创建自己的异常类,这样就可以捕获它们——这些都是故意抛出的异常。也就是说,由于您创建了异常类,所以框架不会抛出这些异常类。

try
{
 // something
}
catch(MyCustomException ex)
{
   // Thrown by Application logic
}
catch(System.Exception ex)
{
   // Could by thrown by anything
}

您可以查看异常的调用堆栈,看看它的顶部是否是您的代码-如果是,则直接生成异常,但无法判断您是使用了throw,还是使用了int除以零的

正如其他人所说的,唯一可靠的方法是抛出其他人无法抛出的异常——那些由您控制并具有公共的不同基类

的异常