2013-02-12 1 views
1

Я хочу получить все IP-адреса своего компьютера. Если что-то пошло не так (исключение), я просто хочу вернуть пустую строку. Вот функция, которую я использую. GetHostEntry забросит несколько исключений, и GetHostName также выбрасывает исключение. Как я должен обрабатывать все эти исключения? Должен ли я поймать каждого из них один за другим? Это сделает код загроможденным. Или я должен просто использовать catch (Exception e) и ничего не делать внутри блока catch? Каков наилучший способ справиться с этим?Сколько исключений я должен уловить и каков правильный способ сделать это?

private string GetIpAddress() 
    { 
     var temp = new StringBuilder(); 
     try { 
       var hostEntry = Dns.GetHostEntry(Dns.GetHostName()); 
       var ips = from address in hostEntry.AddressList 
         where (address.AddressFamily == AddressFamily.InterNetwork) 
         select address; 

       foreach (IPAddress ip in ips) { 
        temp.Append(ip).Append(" "); 
       } 
     } catch (exception1) { 

     } catch (exception2) { 

     } ..... 

     return temp.ToString(); 
    } 
+1

@HovercraftFullOfEels и OP: вполне допустимо ничего не делать внутри блока Catch, пока вы ограничиваете область действия Try. Только игнорируйте исключения из кода, которые вам действительно не нравятся, если это удастся или нет. Иногда «не предпринимайте никаких действий» - это соответствующее действие. –

+1

Случай в точке ... 'BlockingCollection .Take()' генерирует 'InvalidOperationException', когда коллекция завершена, и это контракт * only *, позволяющий определить, есть ли больше элементов. В этом случае хорошо иметь 'catch (InvalidOperationException) {}'. Однако это ситуация * только *, которая приходит в голову, когда я использовал пустой блок catch. –

ответ

4

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

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

1

Если вы действительно хотите просто выбросить исключение, используйте пустой catch.

try 
{ 
    // Code 
} 
catch {} 

(Обратите внимание, что это пара фигурных скобок, а не () «s)

+0

Плохая, плохая идея ... –

+0

'OutOfMemoryException'. 'StackOverflowExcpetion'. В самом деле? – Oded

+2

@Oded: FWIW .NET не позволяет поймать StackOverflowException. –

1

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

Вы должны посмотреть на каждое исключение, которое может быть выброшено, и точно определить, почему оно может быть выброшено, и что вы должны с ним делать. Например, если DnsGetHostEntry() может генерировать исключение, то почему? Если вы вернете ошибку хозяина, не найденную? Есть ли нормальный стандарт, который вы должны вернуть, что имеет смысл в вашем приложении?

1

Handle те, которые вы можете сделать что-то о, или что вы хотите обработать определенным образом (думаю, не удалось подключиться вождения окно сообщения для запроса или не подключен Youre к сети)

Для других " его неправильные "исключения, пусть они распространяются до того места, где мы имеем дело с этим, или реконструируем осмысленное контекстуальное исключение и обрабатываем его, где это уместно.

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

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

0
  • Не заглушать исключения, по крайней мере, записывать строку журнала. Даже если вы предполагаете, что это будет известный вид исключения по известной причине.

  • Не поймать исключение без видимых причин - пусть он пузыриться

  • ли ставить попробовать/поймать на каждые внешних Точка входа - обработчики событий, потоки и т.д. Исключение, что пузырьки вверх от обработчик нажатия кнопки приведет к сбою вашего приложения, то же самое касается кода в другом потоке или даже в том же потоке, если он будет запущен на нем (например, Windows.Forms.Control.Invoke (делегат))

  • имеют наименьшее количество обработчиков и только если вы на самом деле обработки исключений по-разному

  • Добавить слушателю AppDomain.UnhandledException и войти эти тоже

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