Порядок исключения, когда возможно несколько - PullRequest
1 голос
/ 15 ноября 2010

Если функция имеет 2 аргумента и оба выдают исключения, в каком порядке вы бы их подняли и где бы вы ее определили?

Это возникло, когда я писал тест для функции, которая бы принималакаталог на диске и сжать его в файл.Например:

void Compress(string dirPath, string filePath);

Я еще не написал функцию и ставлю свои тесты на место.

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

Я подумал о нескольких способах решения этой проблемы, таких каквсегда выбрасывать на основе обработки аргументов слева направо или указывать «Если dirPath недействителен, то X выбрасывается иначе, если filePath недопустим, тогда Y выбрасывается» и помещать это в определение интерфейса, чтобы тот, кто его реализует, должен (надеюсь) следоватьэта спецификация.

Просто интересно, как люди будут подходить к этой проблеме.

Для справки, это в C #, но я не думаю, что это проблема конкретного языка.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

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

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

1 голос
/ 15 ноября 2010

Я бы оставил это неуказанным.Документация может содержать:

Возможные исключения: X, если dirPath недействителен;Да, если filePath недопустим.

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

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

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