我得到了一个问题:
“你喜欢什么,例外处理或条件?”
接受采访。我的回答是异常处理程序仅在特殊情况下(例如文件写入时的磁盘权限错误)首选。面试官似乎期待着其他一些答案。什么是正确的答案?
编辑:当if条件更合适时,常用异常处理的任何特定示例?
答案 0 :(得分:23)
由于此问题标记为“C#”,我们可以将.NET Framework设计指南称为回答这些类型问题的良好起点。这是MSDN在"Exception Throwing"下提供的指导:
如果可能,请不要将异常用于正常的控制流程。除了 对于系统故障和具有潜在竞争条件的操作, 框架设计者应该设计API,以便用户可以编写代码 这不会引发异常。例如,您可以提供一种方法 在调用成员之前检查前提条件,以便用户可以编写 不抛出异常的代码。
以下是错误做法的示例,其中处理了异常但几乎总是可以避免:
public int? GetItem(int index)
{
int? value = null;
try
{
value = this.array[index];
}
catch (IndexOutOfRangeException)
{
}
return value;
}
这似乎是人为的,但我经常从新的程序员那里看到这样的代码。假设对array
的读写正确同步,可以100%确定地避免此异常。鉴于此,编写该代码的更好方法如下:
public int? GetItem(int index)
{
int? value = null;
// Ensure the index is within range in the first place!
if (index >= 0 && index < this.array.Length)
{
value = this.array[index];
}
return value;
}
在其他情况下,您无法合理地避免异常,只需要处理它们。当您必须处理外部资源(如文件或网络连接)时,最常遇到这种情况,您可能会随时失去对其的访问权限或与之联系。 WCF的示例:
public void Close()
{
// Attempt to avoid exception by doing initial state check
if (this.channel.State == CommunicationState.Opened)
{
try
{
// Now we must do a (potentially) remote call;
// this could always throw.
this.channel.Close();
}
catch (CommunicationException)
{
}
catch (TimeoutException)
{
}
}
// If Close failed, we might need to do final cleanup here.
if (this.channel.State == CommunicationState.Faulted)
{
// local cleanup -- never throws (aside from catastrophic situations)
this.channel.Abort();
}
}
即使在上面的示例中,最好检查您要执行的操作是否至少具有成功的机会。因此,仍然会进行if ()
检查,然后是相应的异常处理逻辑。
答案 1 :(得分:10)
就性能而言,异常处理是一项繁重而昂贵的操作。如果你可以通过使用正确的if else来避免捕获异常,那么可以提高应用程序的性能
另一方面,如果else阻塞对代码阅读器更有意义。与特殊的try catch块相比,它们易于理解和维护。他们以更优雅的方式描述程序流程
最后,正如您所说,异常处理应针对不确定的情况或特殊情况,它不应该是默认选择
修改强>
我在某些地方看到的一个常见的不良做法是
try
{
string str = "Some String"
int i = Convert.ToInt32(str);
}
catch (Exception ex)
{
MessageBox.Show("Invalid input");
}
现在尝试使用if else
在这个外壳中可以轻松避免 string str = "Some String"
int i;
if(!int.TryParse(str, out i))
{
MessageBox.Show("Invalid input");
}
答案 2 :(得分:4)
正确答案就是你提供的答案。
为了更具体的特性,你应该说“由于捕获和抛出异常的开销,我尽可能使用if语句”。
答案 3 :(得分:2)
我通常更喜欢使用一些特殊的 undefined 值(例如对象为null)来指示由于输入无效,某些计算无法产生有效结果。这意味着我的代码可以成功确定并报告输入数据无效,并且无法生成有意义的结果。
当我的代码无法完成所请求的计算时,我更喜欢使用例外,例如如果包含某些必需数据的文件不存在,如果它无法连接到数据库。
概念上说:
答案 4 :(得分:0)
如果您知道程序的确切登录并知道可能发生的错误,那么您可以编写if-else语句,或者在其他情况下,您可以留下一些东西来尝试捕获异常处理。