Есть ли способ отловить все необработанные исключения, выданные данным классом? - PullRequest
3 голосов
/ 08 сентября 2010

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

Если нет способа сделать это (вероятно, так), как бы вы достигли того же эффекта?

Просто чтобы дать немного контекстаЯ использую пользовательский прокси-сервер службы, который отделяет остальную часть приложения от контракта на обслуживание данных (WCF).Мне нужно поймать ошибки, чтобы я мог извлечь определенные поля (внутренние описания и т. Д.), Упаковать их в пользовательское исключение и снова выбросить.

Любая помощь приветствуется.

Ответы [ 6 ]

7 голосов
/ 08 сентября 2010

Если речь идет об исключениях WCF, я бы порекомендовал подключить выделенное поведение в конвейер WCF.Я написал подробный пример здесь

Он основан на двух интерфейсах IErrorHandler и IServiceBehavior, он также может использоваться как атрибут и в конфигурациях на основе файлов.

3 голосов
/ 08 сентября 2010

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

Кроме того, нет причин переносить все вызовы в try / catch. Не зная вашего кода, это, скорее всего, неправильно. Обработка исключений освобождает вас от обработки каждой ошибки локально. Примите это, и ваш код будет намного проще.

2 голосов
/ 08 сентября 2010

На основании вашего комментария к ответу @Brians:

Мне нужно отловить исключения ошибок в прокси службы (wcf), чтобы получить содержательное описание

Не делай этого. Если вы хотите получить осмысленное сообщение, бросьте свое собственное исключение (вы также можете использовать одно из исключений фреймворка, но лучше использовать свое собственное). Поймать системное исключение в том месте, где оно выдается (т.е. FileNotFoundException, исключения SQL и т. Д.), Перебросить как собственное пользовательское исключение.

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

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

Или, что еще лучше, вы можете просто использовать IErrorHandler интерфейс ( MSDN doco здесь ).

0 голосов
/ 16 ноября 2013

Попробуйте ELMAH, он обработает любое необработанное исключение https://code.google.com/p/elmah/

0 голосов
/ 08 сентября 2010

Думаю, вам стоит обратиться к инструментам Enterprise Library или PostSharp.Например, вы можете использовать Enterprise Library и написать собственный обработчик исключений, который будет обрабатывать все исключения (или только некоторые из них) и регистрировать их, например, или писать удобное для пользователя сообщение.Но я думаю, что этот подход следует использовать только в том случае, если вы хотите реализовать ведение журнала, или некоторые данные возвращаются (возвращаются).И вы всегда должны перебрасывать их на уровень пользовательского интерфейса, который должен показывать удобные для пользователя сообщения.

Enterprise Library и подобные инструменты делают оболочки, как предложил EFrank, но они генерируют их автоматически, и эти оболочки прозрачны, поэтомуВызов методов вашего класса, и вы даже не могли знать, что работаете с прокси.

И Enterprise Library имеет поддержку WCF, так что, как я думаю, это должен быть ваш выбор

0 голосов
/ 08 сентября 2010

Я не знаю ни одного способа перехвата всех необработанных исключений, выданных данным классом.

Чтобы достичь того, что вы хотите сделать, нужно создать класс-оболочку, который вызываетОригинальный класс и ловит все исключения.Затем в исходном классе вы можете использовать класс-оболочку без необходимости каждый раз писать блоки try catch.

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