2009-12-11 2 views
9

я попробовать и поймать где я ловить различные типы ошибок:значения C# объявлено, но никогда не использовало

catch (XmlException XmlExp) 
{ 
    return false; 
} 

catch (XmlSchemaException XmlSchExp) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

Обратите внимание, что XmlException XMLExp объявлен, но никогда не используется. Можно ли поймать XMLException без объявления локальной переменной?

Является ли это правильный код:

catch (XmlException) 
{ 
    return false; 
} 
+3

Вы когда-нибудь попробовать, чтобы удалить 'XmlSchExp' текста (ничего другого)? Пытаться. :) –

+11

серьезно, просто попробуйте! это занимает меньше времени, чем вопрос. Кроме того, просто используйте 'throw;' вместо 'throw GenExp;' является вашим намерением перепрофилировать исключение. –

+2

Также неплохо было бы сделать исключение внутри catch catch: 'throw GenExp;'. Вы потеряете трассировку стека. Просто напишите 'throw;' для перебора пойманного исключения. –

ответ

17

Да, как этот

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception GenExp) 
{ 
    // inspect or use GenExp 
    throw; 
} 
+0

Слишком быстро! лол. – James

+14

Вместо этого используйте catch (Exception) {throw}. Это обеспечивает правильную информацию о stracktrace. Повторное исключение уничтожает исходный стек stats –

+3

@Sander - или просто опустите этот блок catch в целом, если он просто перевернул – philsquared

2

Да. Просто пропустите имя переменной:

catch (XmlException) 
{ 
    return false; 
} 
0
catch (XmlException) 
{ 
    return false; 
} 
catch (XmlSchemaException) 
{ 
    return false; 
} 
catch (Exception GenExp) 
{ 
    throw GenExp; 
} 

Просто опускаем имя переменной. Для последнего улова я бы посоветовал использовать throw; вместо throw GenExp - так как последний теряет стек вызовов. Хотя, если вы действительно делаете не что иное, как повторение, просто опустите весь блок catch.

5

Просто используйте

catch (XmlException) 
{ 
    throw; 
} 

Когда вы бросаете конкретный объект исключения, как throw ex трассировки стека получает преодолено.

1

Да, вы можете:

catch (XmlException) 
{ 
    return false; 
} 

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

6

ли это

catch (XmlException) 
{ 
    return false; 
} 

catch (XmlSchemaException) 
{ 
    return false; 
} 

catch (Exception) 
{ 
    throw; 
} 
0
catch (Exception unknownException) 
{ 
    throw new Exception("Unknown error.", unknownException); 
} 
0
catch 
{} 

Также действительный код и ловит все исключения.

0

Важное замечание!

Это очень плохой стиль программирования - использование подобных конструкций:

try 
{ 
    // smth 
} 
catch(IOException e) 
{ 
    throw e; 
} 

Это означает, что стек исключение будет начинаться с этой точкой (стека), и вы можете потерять любые кадры стека, которые ниже этой точки.

Правильно:

try 
    { 
     //smth 
    } 
    catch(IOException e) 
    { 
     throw; 
    } 
0

1- я думаю, что вы должны были сделать это самостоятельно.

2- catch (XmlException) // valid { return false; } catch (XmlSchemaException) // valid { return false; } catch (Exception GenExp)
{ {} Добавить GenExp; }
// действительным, но не имеет смысла, так как исключение будет происходить, и нет никакого подвоха блока пытаются Генделя его