2013-12-04 6 views
4

Я по большей части научился всегда удалять блоки try/catch/finally из моего кода. Причина этого всегда имела смысл для меня (если ваше приложение работает так, как должно, вам не нужно предотвращать ошибки), но в то же время существует так много вещей, которые могут вызывать ошибки, которые не связаны с плохими кодирование; серверные икоты, графика, кажется, никогда не терпит неудачу, когда дело доходит до провала без видимых причин и т. д. Мне также сказали, что эти блоки могут снизить производительность, ничего личного я не заметил, когда я их использовал, но я думаю, это может быть дело. В основном, к чему я отношусь; Try/Catch/Наконец-то плохая общая идея или еще одна из тех, что хороши в некоторых случаях, плохо, когда злоупотребляют для плохого кода, чтобы поддерживать приложение на плаву, хорошо для тестирования/плохого для производства? Просто хотел внести свой вклад.C# Try/Catch/Finally

+0

try/catch не предотвращает ошибок – Steve

+5

Как и все языковые функции, try/catch можно использовать для хорошего и плохого. Как правило, избегайте использования улова для потока управления. Я не думаю, что «наконец» попадает в категорию, о которой вы говорите. В некоторых случаях абсолютно необходимо обеспечить надлежащую очистку ресурсов. Я не думаю, что создание одеяла «не использовать его» решение мудро. Вы хотите оценить каждую ситуацию, чтобы наилучшим образом ее решить. Иногда try/catch - это ответ. – vcsjones

+0

@BenjaminPaul Последний парень, с которым я работал. Он был, верьте или нет, основываясь на этом ответе, мой старший разработчик/менеджер. Я всегда был настроен скептически, но не имел никаких оснований сомневаться в стандартах, предоставляемых им. >. < – Volearix

ответ

1

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

5

Есть ситуации, в которых вы не можете избежать 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

+1

В этом случае аргумент должен был выполнять проверку ошибок и гарантировать, что ключ не существовал до вставки новая запись. Не только ожидание возврата SQL-запроса. – Volearix

+0

Не очень хороший пример, но идея важна. – asawyer

+2

@Volearix и детерминированныйFail, это всего лишь пример .... – Habib

2

Там нет абсолютно ничего плохого в использовании Try/улов /, наконец, блоков, если они используются в продуманном образе.

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

Единственное правило: не злоупотреблять.

+2

На самом деле, я бы удалил часть о пользовательском вводе. Вы не должны проверять ввод пользователя с помощью исключений throwing/catching - недопустимый ввод не является действительно _exceptional_. – dcastro

+0

Я бы сказал, что это зависит от ввода. В некоторых случаях вам может понадобиться проанализировать документ, который плохо сформирован; Пользовательский ввод - это не только поля формы, которые пользователь должен заполнить. – DocKuro

1

Вы должны покупать только исключения, с которыми вы можете иметь дело, другие должны пузыриться. Вы определенно не должны ловить исключения, такие как NullReferenceException или ArgumentOutOfRangeException. Это ошибки и ловушки, скрывающие эти ошибки в вашем коде.

Статьи по этой теме: Vexing exceptions

2

Это совершенно непонятно, почему этот человек хочет, чтобы полностью избавиться от try/catch/finally.

Я даже не понимаю, почему, наконец, в картину попадают блоки?Без наконец, как вы будете надежно очищать ресурсы?

C# language предоставляет using оператор, который на самом деле является синтаксическим сахаром, реализованным над конструкциями try/finally, так это неправильно? или оскорбительным? Можете ли вы реализовать блок использования без try/finally?

foreach использует try/finally и так много мест, где вам это действительно нужно.

Типичный пример: Рассмотрим «Программирование сокетов». Как избежать использования ловли SocketException и IOException при работе с розетками? Это практично? точно нет. они должны использоваться, когда вам нужно.

Заключение: try/catch/finally следует использовать таким образом, как предполагается. Вы не должны есть исключение, это не означает, что вы должны позволить исключению прекратить ваш процесс. Тебе придется справиться с этим.

Смежные вопросы