if-conditionvsexceptionhandler我有一个问题:“你更喜欢什么,异常处理还是条件?”我面试过,我的回答是exceptionhandlers只在特殊情况下使用下首选项,比如写文件时出现磁盘权限错误。面试官似乎在期待其他答案。正确答案是什么?编辑:当if条件更合适时,是否有任何常见异常处理的具体示例?由于这个问题被标记为“C#”,我们可以使用.NETFramework设计指南作为回答此类问题的良好起点。以下是MSDN在“异常抛出”下给出的指导:如果可能,不要对正常控制流使用异常。除了系统故障和具有潜在竞争条件的操作之外,框架设计者还应该设计API,以便用户可以编写不会抛出异常的代码。例如,您可以提供一种在调用成员之前检查先决条件的方法,这样用户就可以编写不会抛出异常的代码。这是一个不良做法的示例,其中处理了异常但几乎总是可以避免的:publicint?GetItem(整数索引){整数?值=空;试试{value=this.array[index];}catch(IndexOutOfRangeException){}返回值;这可能看起来很人为,但我总是从新程序员那里看到这样的代码。假设对数组的读取和写入正确同步,则可以100%肯定地避免此异常。鉴于此,编写此代码的更好方法如下:publicint?GetItem(整数索引){整数?值=空;//首先确保索引在范围内!if(index>=0&&indexinother有些情况下你无法合理地避免异常,你只需要处理它们。当你必须处理外部资源(例如文件或网络连接)时遇到的最常见情况)是您可能无法随时访问或联系他们。来自WCF的示例:publicvoidClose(){//尝试通过执行初始状态检查来避免异常if(this.channel.State==CommunicationState.Opened){try{//现在我们必须进行(可能的)远程调用;//这总是会抛出。这个.channel.Close();}catch(CommunicationException){}catch(TimeoutException){}}//如果关闭失败,我们可能需要在这里做最后的清理。if(this.channel.State==CommunicationState.Faulted){//本地清理——从不抛出(除了灾难性情况)this.channel.Abort();即使在上面的示例中,检查您尝试做的事情是否至少有成功的机会也是一个好主意。所以还是有一个if()检查后面跟着相应的异常处理逻辑。就性能而言,异常处理是一项繁重且昂贵的操作。如果您可以通过使用适当的if避免捕获异常,那么您可以提高应用程序的性能另一方面,ifelse块对代码阅读器更有意义。它们比特殊的trycatch块更容易理解和维护。他们以更优雅的方式描述程序流程最后,正如你所说,异常处理应该是针对非确定性情况,或者对于特殊情况,它不应该是默认选择EDIT我在一些地方看到的常见不良做法就是这样try{stringstr="SomeString"inti=Convert.ToInt32(str);}catch(Exceptionex){MessageBox.Show("无效输入");现在尝试使用ifelse可以轻松避免使用ifstringstr="SomeString"inti;if(!int.TryParse(str,outi)){MessageBox.Show("无效输入");}正确答案是你给的那个。更具体地说,您应该说“由于捕获和抛出异常的开销,我尽可能使用if语句”。我通常更喜欢使用一些特殊的未定义值(例如对象的null)来指示某些计算由于无效输入而无法产生有效结果。这意味着我的代码可以成功确定并报告输入数据无效并且无法产生有意义的结果。当我的代码无法完成请求的计算时,我更喜欢使用异常,例如,如果包含某些所需数据的文件不存在,如果它无法连接到数据库。所以从概念上来说:如果你知道你的程序的确切日志并且知道会发生什么错误,那么你就可以编写if-else语句,或者在其他情况下,你可以留下一些东西来尝试捕获异常处理。以上就是C#学习教程:if-conditionvsexceptionhandler分享的全部内容。如果对您有用,需要进一步了解C#学习教程,希望您多多关注---本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
