我想将列从一个表添加到另一个表。 这里,colName是字符串变量,它是从开发人员提供的硬编码参数中提取的。 因此colName错误的可能性非常小。 我想避免因错误的colName而引发异常。
哪种方法最好? 我想到了下面两个选项。
if(_table.Columns.Contains(colName))
{
AddColumnToTable(_table.Columns[colName]);
}
OR
try
{
AddColumnToTable(_table.Columns[colName]);
}
catch { }
答案 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语句来捕获这类事情,特别是如果性能很重要的话。