C#

老赵面试题参考答案(五)

Posted by Coderidea on September 12, 2020

     异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?

  异常的作用是什么?

  异常用于处理系统级或者应用程序级的错误状态。这就会引发另外几个问题,异常相比原来使用的返回错误代码的优点在哪里?异常处理是一种结构化的处理过程,个人认为他最大的优点就在于将“成功场景”剥离出来,使得代码更加清晰自然。但是异常处理相对于返回错误码有一个缺点,那就是他会失去发生异常的位置。不过异常本身提供了很多帮助调试问题的工具,一般都带有栈跟踪,这样位置的问题就得到一定程度的解决。还有就是IF和异常之间的选择,我记得以前有人讨论过在各种分支下是使用异常来处理各种“失败场景”的分支还是使用IF或者SWITCH来处理呢?这其实是一个假问题,因为异常和错误是有概念上的不同的,这里的错误是指有违“主成功场景”的“异常场景”,尔异常是指当程序不能完成其名字所表示功能时的错误。所以需要强调不要使用异常来区分各种失败场景,异常压根就不是用来干这件事情的!

  .NET BCL中有哪些常见的异常?

  随便说几个,最著名的恐怕就是那句像绕口令一样的“未将对象引用设置到对象实例”了,还有那些基本一出现整个应用程序就被判死刑的“堆栈溢出”、“内存无法分配”异常了。

  在代码中您是如何捕获/处理异常的?

  这道题的回答可以体现你是什么“级别”的程序员,这个级别倒不是说水平的高低,是指经常写哪一类的程序,如果对异常的捕获比较“激进”(经常捕获异常)那么这个人应该是一个应用级的程序员。如果对捕获异常比较谨慎那么应该是框架级别的程序员,这些人经常写给别人使用的代码,如果无故的使用异常处理来越俎代庖,那后果很严重了,这里说一个我经历的事,刚毕业的时候我和同事做一个WEB的项目,项目里用第三方的Grid,那个Grid在发生异常的时候会自己报一个错误,你知道我们有多傻眼了吧,我们需要的是我们来抓住异常,然后报出一句对用户友好的错误,但是那个控件却干了这么个蠢事。

  我觉得普通程序员用的最多的CATCH就是抓住数据的异常,然后回滚数据库来事务处理。这是一个典型的场景,因为你明确并且能够很好的恢复状态。

  在“catch (ex)”中,“throw”和“throw ex”有什么区别?

  throw 重新抛出异常但是不破坏异常发生的调用栈尔“throw ex”会重置调用栈这样捕获异常的人会以为代码出错在这里。

  您会如何设计异常的结构,什么情况下您会抛出异常?

  首先我会尽量的使用系统定义的那些异常,如果我需要处理某一特定类别的异常,而且处理方式和通常处理方式不同那么就考虑自定义异常,还有如果需要调用方用一种统一的方式来处理异常那么自定义异常就是一个好的选择。结构的话当然基类是Sysytem.Exception,尽量使用扁平化异常的层次。可以考虑用泛型类来定义异常。  

  我写的代码不能完成名字所说明的功能,那么我就会抛出异常。