Я по большей части научился всегда удалять блоки try/catch/finally из моего кода. Причина этого всегда имела смысл для меня (если ваше приложение работает так, как должно, вам не нужно предотвращать ошибки), но в то же время существует так много вещей, которые могут вызывать ошибки, которые не связаны с плохими кодирование; серверные икоты, графика, кажется, никогда не терпит неудачу, когда дело доходит до провала без видимых причин и т. д. Мне также сказали, что эти блоки могут снизить производительность, ничего личного я не заметил, когда я их использовал, но я думаю, это может быть дело. В основном, к чему я отношусь; Try/Catch/Наконец-то плохая общая идея или еще одна из тех, что хороши в некоторых случаях, плохо, когда злоупотребляют для плохого кода, чтобы поддерживать приложение на плаву, хорошо для тестирования/плохого для производства? Просто хотел внести свой вклад.C# Try/Catch/Finally
ответ
Основным правилом является перехват исключений, когда и где вы можете обращаться с ними. Если вы не можете справиться с ними, пропустите их. Окончательная обработка всего, что не удалось в ходе выполнения программы, может регистрироваться и показывать пользователю сообщение об ошибке.
Есть ситуации, в которых вы не можете избежать Try/Catch
,
Рассмотрим ситуацию, когда вы хотите, чтобы пользователь, чтобы ввести некоторые данные, которые будут введены в таблицу базы данных. Ввод пользователя также включает в себя первичный ключ. Теперь, если какой-либо пользователь вводит дублирующий первичный ключ, вы получите исключение. Что бы вы хотели делать теперь ? пусть система выйдет из строя или обработает исключение и покажет пользователю удобное для пользователя сообщение для ввода чего-то другого/уникального.
Рассмотрим пример, Предположим, вы хотите проверить, если некоторые URL действителен и доступен вам может понадобиться метод, как: (take from here)
private bool IfURLExists(string url)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return (response.StatusCode == HttpStatusCode.OK);
}
catch //may catch specific WebException First
{
return false;
}
}
выше метод не будет работать без try/catch
.
Другого важное использованием try/finally
является с using
заявления, using
работает с тем объектом, который реализует интерфейс IDisposable
и переводит в try/finally
блок так, если происходит исключение было бы обеспечить удаление неуправляемого ресурса.
Вообще ловить только те исключения, если вы хотите сделать что-то полезное с ними, в противном случае пусть exception bubble up
В этом случае аргумент должен был выполнять проверку ошибок и гарантировать, что ключ не существовал до вставки новая запись. Не только ожидание возврата SQL-запроса. – Volearix
Не очень хороший пример, но идея важна. – asawyer
@Volearix и детерминированныйFail, это всего лишь пример .... – Habib
Там нет абсолютно ничего плохого в использовании Try/улов /, наконец, блоков, если они используются в продуманном образе.
Как разработчик вы даже не представляете, насколько отличается от вас клиент может думать, или как ваша система будет взаимодействовать с различными системами или реагировать на входы, о которых вы и не думали.
Единственное правило: не злоупотреблять.
На самом деле, я бы удалил часть о пользовательском вводе. Вы не должны проверять ввод пользователя с помощью исключений throwing/catching - недопустимый ввод не является действительно _exceptional_. – dcastro
Я бы сказал, что это зависит от ввода. В некоторых случаях вам может понадобиться проанализировать документ, который плохо сформирован; Пользовательский ввод - это не только поля формы, которые пользователь должен заполнить. – DocKuro
Вы должны покупать только исключения, с которыми вы можете иметь дело, другие должны пузыриться. Вы определенно не должны ловить исключения, такие как NullReferenceException
или ArgumentOutOfRangeException
. Это ошибки и ловушки, скрывающие эти ошибки в вашем коде.
Статьи по этой теме: Vexing exceptions
Это совершенно непонятно, почему этот человек хочет, чтобы полностью избавиться от try/catch/finally
.
Я даже не понимаю, почему, наконец, в картину попадают блоки?Без наконец, как вы будете надежно очищать ресурсы?
C# language предоставляет using
оператор, который на самом деле является синтаксическим сахаром, реализованным над конструкциями try/finally
, так это неправильно? или оскорбительным? Можете ли вы реализовать блок использования без try/finally
?
foreach
использует try/finally
и так много мест, где вам это действительно нужно.
Типичный пример: Рассмотрим «Программирование сокетов». Как избежать использования ловли SocketException
и IOException
при работе с розетками? Это практично? точно нет. они должны использоваться, когда вам нужно.
Заключение: try/catch/finally
следует использовать таким образом, как предполагается. Вы не должны есть исключение, это не означает, что вы должны позволить исключению прекратить ваш процесс. Тебе придется справиться с этим.
- 1. Можем ли мы написать класс внутри функции VBScript?
- 2. Java: попробуйте-с-ресурсов против примерочных улова наконец о порядке autoclosing
- 3. Анализ файла c/C++/C# в C#
- 4. Переустановка C-c на C-c
- 5. Есть ли разница между C c; и C c = C();
- 6. Что такое C++ (generic (c/C++) vs (generic c)/C++)
- 7. C/C++ с объективом C
- 8. Компиляция C, C++, Objective-C et Objective-C++ на Mac
- 9. Ресурсы C/C++ для разработки с использованием MetroWerks C/C++
- 10. Emacs + python C-c C-c не работает
- 11. Преобразование C++ в C Использование C++ в C
- 12. matlab в C C++ и C C++ в matlab
- 13. JNI как вызвать функцию C/C++ в C/C++?
- 14. Библиотека Eye-Tracking в C#, C/C++ или Objective-C
- 15. Как определить emacs keybinding 'C-c C-c'?
- 16. Emacs C-c C-c для кода python
- 17. C# Code Analyzer для C, C#, C++ и Java.
- 18. C vs C++ (Objective-C vs Objective-C++) для iPhone
- 19. Как запустить приложение c/C++ в eclipse для c/C++
- 20. Префиксный ключ `C-S-c` отражается как` C-c`
- 21. Введение в C# для пользователей C/C++
- 22. Конвертер C/C++ в C# или эмулятор
- 23. main() в C, C++, Java, C#
- 24. C Стиль Струны Разница: C/C++
- 25. Что эквивалентно PrintDocument C# в C/C++?
- 26. виртуальный файл? в c/C++ или C#
- 27. C# эквивалент cd C: \ appFolder c: \ app.exe?
- 28. char c [] = "Albus"; printf ("% c", c);
- 29. получение объектива c nsstring c c char []
- 30. Objective-C++ Calling C или C++ function
try/catch не предотвращает ошибок – Steve
Как и все языковые функции, try/catch можно использовать для хорошего и плохого. Как правило, избегайте использования улова для потока управления. Я не думаю, что «наконец» попадает в категорию, о которой вы говорите. В некоторых случаях абсолютно необходимо обеспечить надлежащую очистку ресурсов. Я не думаю, что создание одеяла «не использовать его» решение мудро. Вы хотите оценить каждую ситуацию, чтобы наилучшим образом ее решить. Иногда try/catch - это ответ. – vcsjones
@BenjaminPaul Последний парень, с которым я работал. Он был, верьте или нет, основываясь на этом ответе, мой старший разработчик/менеджер. Я всегда был настроен скептически, но не имел никаких оснований сомневаться в стандартах, предоставляемых им. >. < – Volearix