Как следует обрабатывать исключения при обработке коллекции? - PullRequest
1 голос
/ 12 января 2010

Допустим, у вас есть функция (X), которая берет один объект и выполняет с ним некоторую работу. Это может как-то не сработать:

function X(obj) throws SomeException

И у меня есть коллекция этих объектов, и я хочу запустить X на всех них. Поэтому я обернул это в свою собственную функцию:

function Y(objs)
  foreach obj in objs
    X(obj)
  end
end

Каков наилучший способ обработки исключений, возвращаемых X?

Один очевидный выбор - вообще не перехватывать исключение, что приводит к остановке обработки коллекции при первом сбое.

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

Другой вариант - полностью игнорировать исключение, возвращая что-то вроде логического массива, отмечающего успех / неудачу, или даже возвращать массив возникших исключений.

Ответы [ 7 ]

1 голос
/ 12 января 2010

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

Может быть, это возможно. Но не в коде в вашем фрагменте, в нем нет кода, который отвечает за ввод объектов в коллекцию. Вы не должны ловить исключение, если не знаете, как восстановить состояние.

1 голос
/ 12 января 2010

Ну, я думаю, это почти то же самое, но это неправильный или неправильный ответ, просто более правильный или ворга для определенного случая.
Захватывать и продолжать отбрасывать исключения может быть довольно дорого для машины, но это может быть вашим желаемым поведением.
Я могу дать два указателя:
- если вы намереваетесь отказаться от процесса сбора, если кто-то ошибается, просто запишите исключение и делайте все, что захотите;
- если вы хотите утверждать, является ли какой-то элемент записанным или неправильным, утверждая все, вы должны захватить их все, и если вам это нравится, либо просто зарегистрируйте его или откажитесь от него, либо сохраните все эти «внутренние исключения» и отбросьте или обработайте все они в конце процесса.

Какова именно ситуация?

1 голос
/ 12 января 2010

Это очень сильно зависит от того, что вы делаете.

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

Если вы фиксируете кучу элементов, которые были проанализированы из стороннего источника, и вы ожидаете, что некоторые сбои будут хранить записку о неисправных элементах и ​​возвращать объект статуса, вполне возможно, что это и есть.

1 голос
/ 12 января 2010

Ответ полностью зависит от того, что вы делаете со своими объектами, и от контекста, в котором это происходит.

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

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

1 голос
/ 12 января 2010

Это будет полностью зависеть от состояния списка после завершения.

Если допустимо, что некоторые элементы обрабатываются некорректно, либо проглотите их, либо верните логическое значение, указывающее на успех / неудачу.

Если требуется, чтобы все элементы обрабатывались правильно, у меня было бы исключение всплывающее , а точнее.

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

1 голос
/ 12 января 2010

Нет правильного ответа.

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

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

1 голос
/ 12 января 2010

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

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