Как я могу сказать, что Исключение было сделано намеренно? - PullRequest
1 голос
/ 25 января 2012

Я хотел бы поймать исключение и сказать, было ли это, что я умышленно выдал ошибку или что-то вроде ошибки времени выполнения (объект не экземпляр объекта).

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, тогда произойдет ошибка во время выполнения.

Но я понял, что поступаю неправильно по этому поводу ... как упоминал Гэри ... я не должен использовать исключения в качестве управления потоком.

Ответы [ 4 ]

5 голосов
/ 25 января 2012

Используйте специальный тип исключения для своих собственных исключений и проверьте его.

В противном случае вам придется прибегнуть к проверке следов стека, чтобы определить, является ли источник одной из ваших сборок, что и уродливо, и ненадежно.

5 голосов
/ 25 января 2012

Используйте другое исключение. Дайте ему свое собственное предложение поймать.

4 голосов
/ 25 января 2012

Вы не можете сказать , почему было сгенерировано исключение.

То, что вы можете сделать, - это создать свои собственные классы исключений, чтобы вы могли их отлавливать - это будут исключения, созданные специально. То есть, поскольку вы создали класс исключений, фреймворк не собирается их выбрасывать.

try
{
 // something
}
catch(MyCustomException ex)
{
   // Thrown by Application logic
}
catch(System.Exception ex)
{
   // Could by thrown by anything
}
0 голосов
/ 25 января 2012

Вы можете посмотреть на стек вызовов для исключения и посмотреть, является ли его верхняя часть вашим кодом - если это так, вы напрямую создали исключение, но нет никакого способа узнать, использовали ли вы throw или, скажем, разделенноеint на ноль

, как говорили другие, единственный надежный способ запуска - генерировать исключения, которые не могут быть сгенерированы кем-либо еще - те, которые вы контролируете и имеют общий отдельный базовый класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...