2010-09-08 5 views
3

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

В случае, если это невозможно сделать (вероятно, так будет), как бы вы достигли такого же эффекта?

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

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

ответ

7

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

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

+0

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

+0

@Johnldol, я не уверен, что это то, что вы описываете, но типичный шаблон с WCF заключается в том, чтобы обернуть все использование прокси-сервера с помощью метода, который принимает делегат для действия, выполняемого службой. Этот метод может открыть канал, уловить любые исключения, вызванные при использовании службы (например, сбои связи), и соответствующим образом преобразовать их, а затем закрыть канал. Это также означает, что вы гарантируете, что вы вызываете Abort() на канале, если он неисправен. –

+0

@ Dan У меня есть что-то подобное в базовом классе прокси-сервера службы для ошибок связи. Проблема здесь в том, что каждая реализация прокси-сервера службы для конкретной службы должна обрабатывать конкретные ошибки (разные типы, объявленные данной службой, «проксированные») и извлекать все поля описания в классах сбоев. – JohnIdol

3

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

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

+0

приветствий - мой (Интернет) приложение является довольно огромный и я не может иметь глобального обработчика, потому что он поймает все, и я не хочу этого. Мне нужно перехватывать исключения в прокси-сервере службы (wcf) для сбора значимого описания и повторного броска, чтобы верхние уровни могли обрабатывать его по своему усмотрению. – JohnIdol

+1

@JohnIdol: Я не говорю, что у вас должен быть только один обработчик, но упаковка каждого вызова в try/catch не подходит. –

+0

ищет альтернативы здесь :) – JohnIdol

0

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

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

2

Основываясь на ваш комментарий к @Brians ответить:

Мне нужно перехватывать исключения сбоев в (ФОС) службы прокси для того, чтобы собрать осмысленное описание

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

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

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

Или, еще лучше, вы можете использовать IErrorHandler interface (MSDN doco here).

+0

это именно то, что я пытаюсь сделать, сбор внутренних описаний и упаковки в моих собственных исключениях для верхних слоев - я ищу способ сделать это, что не включает в себя обертывание всех вызовов что данный класс с блоком catch try. – JohnIdol

0

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

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

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

Смежные вопросы