2013-07-04 2 views
4

Я хотел бы знать, какой из лучших способов сделать исключение, потому что в моем заявлении Try у меня есть много валидаций, и если я получу Exception, мой оператор Catch может сказать мне что происходит, но как я могу узнать, в каком поле происходит Exception?Исключение обработки наилучшей практики

Пример кода

try 
{ 
    // If I get a Exception when converting to number, 
    // I will understand the error 
    // but how could I know where in my `Try` statement was the error ? 
    int valor = Convert.ToInt32(xmlnode[i].ChildNodes.Item(2).InnerText.Trim()); 
    // A Lot of another validations here 
} 
Catch(Exception e) 
{ 
     this.LogInformation(e.Message); 
} 
+0

исключить исключение –

+3

для всех 'Convert', если вы не уверены, что они действительны, вы должны использовать' TryParse'. Например. для Int32: http://msdn.microsoft.com/en-us/library/f02979c7.aspx – Bolu

ответ

3

Лучшие практики было бы не использовать Try-Catch вообще при преобразовании строк в числа. Поэтому вы должны использовать методы TryParse, такие как int.TryParse.

// note that here is also a possible error-source 
string valorToken = xmlnode[i].ChildNodes.Item(2).InnerText.Trim(); 
int valor; 
if(!int.TryParse(valorToken, out valor)) 
{ 
    // log this 
} 
// else valor was parsed correctly 

Кроме того, если вы хотите, чтобы предоставить точные сообщения об ошибках, вы должны использовать несколько try-catch или обрабатывать различные типы исключений (наиболее общий тип Exception должен быть последним).

+0

Но это был всего лишь пример, у меня есть много валидаций, а не только 'Convert.toInt32'. Я просто хочу получить, где мой код остановится в моем заявлении Catch. –

0

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

Обычно вы можете сделать:

try 
{ 
    // If I get a Exception when converting to number, 
    // I will understand the error 
    // but how could I know where in my `Try` statement was the error ? 
    int valor = Convert.ToInt32(xmlnode[i].ChildNodes.Item(2).InnerText.Trim()); 
    // A Lot of another validations here 
} 
Catch(IOException ioe) { 
     // Handle, log 
} 
Catch(ArgumentNullException ane) { 
     // Handle, log 
} 
Catch(Exception e) 
{ 
     // Handle, log and potentially rethrow 
} 

Вы также можете иметь индивидуальные попробовать уловы (что-то, что большинство людей будут делать, я думаю) или вложенные Try уловы в вашей Ьге блоке:

Like

// First block 
try { 
    // Convert here once 
} catch (Exception ex) { 
// Handle and log 
} 

// Second block 
try { 
    // Convert here once 
} catch (Exception ex) { 
// Handle and log 
} 

Не уверен, что это вообще помогает.

+0

В вашем названии упоминаются рекомендации об исключениях. Если бы его просто разбор синглов, то я бы пошел на ответ Тобиси – Yannis

1

Move try..catch внутри цикл. Таким образом, вы будете знать, какой элемент вызвал именно исключение

foreach(var xmlNode in nodes) 
{ 
    try  
    { 
     // 
     int valor = Convert.ToInt32(xmlNode.ChildNodes.Item(2).InnerText.Trim()); 
     // A Lot of another validations here 
    } 
    catch(Exception e) 
    { 
     LogInformation(e.Message); // current item is xmlNode 
     return; 
    } 
} 
0
try 
{ 
} 
catch (Exception ex) 
{ 
    var stackTrace = new StackTrace(ex, true); 

    var frame = stackTrace.GetFrame(0); 

    var line = frame.GetFileLineNumber(); 

    var method = frame.GetMethod(); 
} 
3

Не используйте Convert.ToInt32, если вы не уверены в ценности. Использование Int32.TryParse вместо:

int valor; 
if (Int32.TryParse(xmlnode[i].ChildNodes.Item(2).InnerText.Trim(), out valor)) 
{ 
    // Worked! valor contains value 
} 
else 
{ 
    // Not a valid Int32 
} 

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

Придумайте тест, который проверяет правильность данных и возвращает true или false. Практически все числовые типы имеют метод TryParse, как указано выше. Для ваших собственных правил для других методов проверки вы найдете спецификацию, которая точно определяет, какой действительный и недействительный ввод, а затем написать метод для реализации этой спецификации.

1

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

В этом случае, есть TryParse, который позволяет определить, что значение не является допустимым для синтаксического анализа:

int valor; 
if(int.TryParse(xmlnode[i].ChildNodes.Item(2).InnerText.Trim(), out valor)) 
{ 
    // "valor" is sucessfully parsed 
} 
else 
{ 
    // invalid parse - do something with that knowledge 
} 
+0

Но это был всего лишь пример, у меня есть много валидаций, а не только 'Convert.toInt32'. Я просто хочу получить, где мой код остановится в моем заявлении Catch. –

+0

@ Lucas_Santos - И мой ответ был просто примером. Вы должны делать что-то подобное для всего, что, по вашему мнению, может потерпеть неудачу. – Jamiec

+0

вам не нужно присваивать значение с помощью 'int valor = 0', достаточно объявления с' int valor'! –

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