Есть ли способ перехватить все исключения определенного типа в статическом классе в C #? - PullRequest
0 голосов
/ 30 июля 2010

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

Рассмотрим некоторую пользовательскую оболочку для операций BinaryWriter / BinaryReader.(Да, я знаю о сериализации .NET) Во всех методах этого класса могут быть определенные исключения, например, передача байта [], который слишком короток для данных, которые вы пытаетесь прочитать изэто или попытка прочитать неправильный тип.

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

Есть ли чистый / хороший способ сделать это, если не бросать попытку / ловушку вокруг каждой операции чтения / записи?Или это все еще большая проблема, потому что пользователи библиотеки должны просто попытаться перехватить вызовы для класса?

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Вы можете обернуть функции BinaryWriter / Reader в свой собственный объект и поймать исключения там.

1 голос
/ 30 июля 2010

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

Если по какой-то причине допустимо, что ваше обновление не может прочитатьстарые файлы с данными уже затем решаются в корне.Добавьте, скажем, номер версии к данным, чтобы вы могли легко обнаружить, что файл больше не используется.Больше не нужно использовать исключение.Или, если проще раскрутить логику, вам нужен только один тип исключения.Оставляя все остальные исключения, для которых они были предназначены: «здесь что-то действительно не так, давайте не будем пытаться использовать».

1 голос
/ 30 июля 2010

Предоставление пользователю / вызывающей стороне разрешения исключительной ситуации имеет смысл в некоторых сценариях.Какие действия вы планируете делать, когда ловите исключения?

Можете ли вы разделить свой код на несколько методов / функций?Каждый из них должен делать одну вещь, поэтому у вас будет 1 или 2 блока (ов) try-catch.

Обработка исключений в C #: множественные попытки / ловли против одного

...