Суть обработки ошибок не в том, поймешь ли и как. Это больше того, что вы делаете после того, как узнаете об этом .
Прежде всего - я бы сказал, что нет причин, по которым любая отдельная ошибка, возвращаемая подчиненным методом, не должна обрабатываться. А ошибки и исключения - это больше, чем возвращаемые значения или все try / catch.
Просто бросать и ловить недостаточно.
Посмотрите на это : где автор объясняет, что простое обнаружение, но бездействие потенциально подавляет исключение, и, если не будет сделано достаточно, чтобы устранить ущерб, - это хуже, чем просто допустить выполнение кода. Точно так же просто написание оператора «log» при открытии файла или ошибке чтения может помочь найти причину - но к тому времени, когда программа завершает работу, это может привести к повреждению данных! Недостаточно сказать, что у меня есть много попыток / поймать - более важно знать, что они действительно делают!
Не злоупотребляйте попыткой поймать.
Иногда - в основном ленивые или наивные программисты думают, что после написания достаточного количества try / catch их работа заканчивается и становится легкой. Довольно часто лучше применять корректирующие действия и возобновлять, чем просто сбрасывать все целиком. Если это невозможно, нужно решить, на какой уровень вам нужно вернуться. В зависимости от контекста и серьезности, попробуйте поймать вложенность требует тщательного проектирования. Например,
увидеть это и это
Определите, кто несет ответственность:
Первое, что вы должны сделать, это определить, является ли ввод данных, передаваемых самой подпрограмме, просто неприемлемым (или пока не обработанным) сценарием или является исключением из-за окружения (например, системной проблемы, проблемы с памятью) или Является ли эта ситуация полностью внутренним результатом алгоритма. Во всех случаях - уровень, к которому вы можете вернуться, или действие, которое вы хотите предпринять, существенно различаются. В этом свете я хотел бы сказать - что когда вы запускаете код в рабочей среде, выполнение abort () для выхода из программы - это хорошо, но не для каждой мелочи. Если вы обнаружите повреждение памяти или нехватку памяти, это определенно, что даже после того, как вы приложите все усилия - все умрет. Но если вы получите нулевой указатель на входе - я бы не
Определите, каков наилучший возможный результат:
все, что должно быть сделано в условиях исключения, очень важно. Например, если в одном из наших случаев - медиаплеер обнаружит, что у него нет полных данных, которые должны быть воспроизведены для пользователя - что он должен делать?
- либо пропустите какую-то плохую часть и посмотрите, сможет ли она добиться успеха с хорошими вещами.
- если это произойдет слишком много, подумайте, можно ли перейти к следующей песне.
- если он обнаружит, что не может прочитать какой-либо файл - остановитесь и покажите что-нибудь.
- в то же время
- под каким государством игрок должен POP-UP для пользователя и
- когда он должен нести сам по себе?
- Должно ли это "остановить" вещи, чтобы попросить пользователя обратной связи
- или это должно поместить небольшую ненавязчивую заметку об ошибке в некоторый угол?
Все это субъективно - и, возможно, есть больше способов справиться с проблемами, чем мы тривиально. Все вышеперечисленное требует построения и понимания глубины исключения, а также обеспечения возможности развития различных сценариев.
Иногда нам нужно проверять исключения, прежде чем они возникнут. Наиболее распространенным примером является ошибка деления на ноль. В идеале нужно проверить, что перед тем, как возникнет такое исключение - и если это так, - постарайтесь поставить наиболее подходящее ненулевое значение и двигаться дальше, а не совершать самоубийство!
Очистка. По крайней мере, это то, что вы должны сделать! Если случается, что функция открывает 3 файла, а четвертый не открывается - само собой разумеется, первые 3 должны были быть закрыты. Передача этой работы на уровень выше - плохая идея. если вы решили совсем не уходить без очистки памяти. И самое главное - даже если вы пережили исключение, сообщите об этом выше, что все пошло не так, как обычно.
То, как мы видим (нормальную) функциональность программного обеспечения в терминах различных иерархий или уровней или абстракций, так же, как мы должны классифицировать исключения на основе их серьезности, а также области, в которой они возникают, и они влияют на другие части системы - это определяет как обрабатывать такие разные исключения в лучшем виде.