Во всех распространенных языках / интерпретаторах / компиляторах обработка исключений реализована таким образом, чтобы иметь минимальное влияние на производительность, когда исключение не вызывается - под капотом добавление обработчика исключений обычно просто вызываетодно значение в стеке или что-то подобное.Простое добавление блока try
обычно не сказывается на производительности.
С другой стороны, когда действительно возникает исключение, все может очень медленно работать очень быстро.Это компромисс для возможности добавления блока try, не беспокоясь о беспокойстве, и обычно считается приемлемым, потому что вы получаете удар по производительности только в том случае, если что-то неожиданное уже пошло не так в другом месте.
Итак,теоретически, если есть условие, которое вы ожидаете , используйте вместо него if
.Это семантически лучше, потому что он выражает читателю, что плохое состояние, вероятно, будет происходить время от времени (например, пользователь вводит некоторые неверные данные), в то время как try
выражает то, что, как вы надеетесь, никогда не произойдет (источник данныхкоррумпированной).Как и выше, производительность также будет проще.
Конечно, правила определяются своими исключениями (без каламбура).На практике есть две ситуации, когда это становится неправильным ответом:
Во-первых, если вы выполняете сложную операцию, такую как анализ файла, и его и все или ничего - если одно поле в файлеповрежден, вы хотите поручить всю операцию.Исключения позволяют вам выпрыгивать из всего сложного процесса до обработчика исключений, инкапсулирующего весь анализ.Конечно, вы можете засорять код синтаксического анализа проверками, возвращаемыми значениями и проверками возвращаемых значений, но это будет намного чище, если просто выбросить исключение и позволить ему подняться наверх операции.Даже если вы ожидаете, что ввод будет иногда плохим, если нет разумного способа обработать ошибку именно в той точке, где происходит ошибка, используйте исключения, чтобы позволить ошибке подняться до более подходящего места для обработкиЭто.Вот для чего в первую очередь были исключения: избавиться от всего этого кода обработки ошибок в деталях и переместить его в одно, консолидированное, разумное место.
Во-вторых, библиотека может не позволить вамсделай выбор.Например, int.TryParse
является хорошей альтернативой int.Parse
, если входные данные еще не проверены.С другой стороны, библиотека может не иметь опцию выбрасывания исключений.В этом случае не собирайте свой собственный код для проверки без исключений - хотя может быть плохой способ использовать обработку исключений для проверки на ожидаемое состояние, его худшая форма - дублировать функциональность библиотеки, просто чтобы избежатьисключение.Просто используйте try/catch
и, возможно, добавьте небольшой комментарий о том, что вы НЕ ХОТИТЕ это сделать, но авторы библиотеки СДЕЛАЛИ вас :).
Для вашего конкретного примера, вероятно, придерживайтесь исключения.Хотя обработка исключений не считается «быстрой», она все же быстрее, чем обратная передача в базу данных;и не будет разумного способа проверить это исключение, не отправив команду в любом случае.Кроме того, взаимодействие с базой данных при взаимодействии с внешней системой - это само по себе довольно веская причина ожидать неожиданного - обработка исключений почти всегда имеет смысл, когда вы покидаете свою конкретную контролируемую среду.
Илиболее конкретно к вашему примеру, вы можете рассмотреть возможность использования хранимой процедуры с оператором MERGE, чтобы использовать исходные данные в table
для обновления или вставки в зависимости от ситуации;обновление будет более дружественным на всех фронтах, чем удаление-затем-вставка для существующих ключей.