尝试catch v / s if语句

时间:2015-06-26 12:28:27

标签: c# if-statement try-catch clr

我想将列从一个表添加到另一个表。 这里,colName是字符串变量,它是从开发人员提供的硬编码参数中提取的。 因此colName错误的可能性非常小。 我想避免因错误的colName而引发异常。

哪种方法最好? 我想到了下面两个选项。

if(_table.Columns.Contains(colName))
{
     AddColumnToTable(_table.Columns[colName]);
}

OR

try
{
     AddColumnToTable(_table.Columns[colName]);   
}
catch { }

4 个答案:

答案 0 :(得分:4)

首先,当发生这种情况时,全世界都死了一点:

catch { }

但我离题了......

真正的问题不是你应该使用if还是try真正的问题是:

  

如果无法添加列,那么是什么?

如果这是预期的情况,基本上"不是什么大不了的事情"并且逻辑可以继续正常而不添加列,然后if绝对是可行的方法。正如对该问题的评论所述,"测试然后行动"。

但是,如果这是预期的情况,那么"是一个大问题"并且逻辑无法有意义地继续,抛出异常。不要抓住它而忽略它。让消费代码(在应用程序级别)捕获并处理它,可能通知用户或记录错误,甚至尝试以某种方式纠正错误。

(或者,如果此代码在应用程序级别为,请在此处捕获并处理它。重点是handling is different from catching。后者是一个简单的catch块,前者是以有意义的方式响应错误所需的自定义逻辑。)

您甚至可以向例外添加更多信息。例如:

try
{
    // perform some operation
}
catch (SpecificException ex)
{
    throw new CustomException("Failed to perform Operation X in the context of Y.", ex);
}

在诊断无法连接调试器的生产系统时,这可能非常有价值。具体的异常类型,有用的错误消息,当然还有原始异常的技术细节都是必要的工具。

答案 1 :(得分:0)

仅根据您提供的信息,只有一个结论:

if(_table.Columns.Contains(colName))
{
    AddColumnToTable(_table.Columns[colName]);
}

因为替代方法是使用空catch块进行异常处理。这基本上意味着你的意图是在没有找到colName的情况下做任何事情。 但是,如果你的代码被剥离到一个任意的例子而你刚刚清除了catch块以使帖子更加浓缩,那么结论可能会有所不同。

这样做:

catch { }

无论如何应该避免。

基于此声明:

  

这里,colName是字符串变量,它是从开发人员提供的硬编码参数中提取的。

您可以选择在代码中包含断言而不是异常,因为传递错误的列名称可能会被视为应用程序错误。 因为你真的不想预见异常,我认为断言是一个很好的选择。这将产生以下代码:

if(_table.Columns.Contains(colName))
{
    AddColumnToTable(_table.Columns[colName]);
}
else Debug.Assert(false,"Column name is wrong, please correct calling code.");

或更多缩写:

Debug.Assert(_table.Columns.Contains(colName),
             "Column name is wrong, please correct calling code.");
AddColumnToTable(_table.Columns[colName]);

答案 2 :(得分:0)

如果可以使用 if ,请不要使用try / catch。这是代码可读性和可维护性的问题。

但是,如果您重视性能,则可能会在此方案中考虑失败的可能性。您的库可能执行以下操作:

void AddColumn(string columnName, Column column)
{
    if(this.Columns.Contains(columnName))
         throw new DuplicateColumnException();
    else
         this.Columns.Add(columnName, column);
}

这意味着你的if会添加第二个Contains调用,并且根据其复杂性,抛出异常可能比调用第二次检查更好。

解决此问题的最佳方法是找到设置列的方法:

void SetColumn(string columnName, Column column)
{
    if(this.Columns.Contains(columnName))
         this.Columns[columnName] = column;
    this.Columns.Add(columnName, column);
}

或简单地说:

void SetColumn(string columnName, Column column)
{
    this.Columns[columnName] = column;
}

答案 3 :(得分:0)

过去我写的游戏性能非常重要。我发现在" catch"声明遭到重创,表现出严重影响。事情真的很慢。我想这是因为它必须捕获有关出错的所有细节,并尝试在catch语句中输出所有非常低效的东西。我会尽量避免使用try语句。最好做一个if语句来捕获这类事情,特别是如果性能很重要的话。