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);
}
4

6 回答 6

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
}

此外,您不应该使用异常来捕获验证错误。您的验证代码应该计算值是否正确,而不是在错误时失败。验证类应该期望接收有效和无效数据作为输入。因为您期望输入无效,所以您不应该在它无效时捕获异常。

想出一个测试来检查数据是否有效并返回真或假。几乎所有数字类型都有一个像上面这样的 TryParse 方法。对于其他验证方法的自定义规则,提出一个规范,准确定义有效和无效输入是什么,然后编写一个方法来实现该规范。

于 2013-07-04T14:05:01.110 回答
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类​​型必须是最后一个)。

于 2013-07-04T14:06:21.450 回答
1

在循环内移动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;
    }
}
于 2013-07-04T14:03:06.970 回答
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
}
于 2013-07-04T14:06:15.630 回答
0

除非创建了不同的异常(即不同的类),否则您将需要使用不同的尝试捕获来处理它。

通常你可以这样做:

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 块中使用单独的 try catch(我认为大多数人都会这样做)或嵌套的 try catch:

喜欢

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

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

不确定这是否有帮助。

于 2013-07-04T14:03:00.257 回答
0
try
{
}
catch (Exception ex)
{
    var stackTrace = new StackTrace(ex, true);

    var frame = stackTrace.GetFrame(0);

    var line = frame.GetFileLineNumber();

    var method = frame.GetMethod();
}
于 2013-07-04T14:04:06.267 回答