如何故意抛出异常?

时间:2012-01-25 17:18:33

标签: c# .net exception-handling

我想捕获一个异常,告诉我是故意抛出错误还是其他类似运行时错误(对象不是对象的实例)。

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"));

}

澄清:

我需要记录所有异常然后在最后将它们显示在异常报告中(例外数组)。这是schema我需要遵循的一部分。 (所以请不要让我以另一种方式去做。)

我把它做得很好,输出的东西如下:

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

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

但我已经意识到我对此的态度错误......正如加里所说......我不应该使用例外作为流量控制。

4 个答案:

答案 0 :(得分:5)

使用其他异常。给它自己的catch子句。

答案 1 :(得分:5)

为您自己的例外使用特殊类型的例外并检查它。

否则你不得不求助于检查堆栈跟踪以查看原点是否是你的一个程序集,这既丑陋又不可靠。

答案 2 :(得分:4)

你不能告诉为什么抛出了异常。

可以做的是创建自己的异常类,以便捕获它们 - 这些将是故意抛出的异常。也就是说,由于您创建了异常类,因此框架不会抛出这些。

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

答案 3 :(得分:0)

您可以查看异常上的调用堆栈,看看它的顶部是否是您的代码 - 如果是这样,您直接产生了异常,但是没有办法判断您是否使用了throw或者说,将零除以

正如其他人所说的唯一可靠的解决方法是抛出其他人无法抛出的异常 - 你控制的异常并且有一个共同的不同基类