C#有关异常处理机制的几个问题,想请教求解
2、为什么要用异常处理机制?是不是程序出现的异常一般都无法解决才要用这个机制告诉用户有异常
3、为什么有捕获异常还要弄个throw来抛出异常使得程序中止呢?
4、什么样的异常能被抛出?什么时候要抛出异常?完美运行的程序能不能抛出异常?
5、为什么要自定义异常?既然知道哪里有异常为什么不去解决而是自定义异常呢?
求解,被C#的异常处理机制弄得团团转,问题有点多,有些可能很白痴,但就是疑惑,希望帮帮忙,分数剩下不多,希望不要介意。。。 展开
1、异常一般是用在软件中一些意外情况的处理上,举个例子,比说你的软件是个看图软件,你用它去打开一个名叫1.jpg的图片并显示在软件中,正常情况下没什么问题,但是,有些时候这个操作可能根本无法完成(比如说这个jpg实际上是个gif格式的图片,只是扩展名被改成了jpg,又或者这个jpg数据已经损坏了),这种情况下就必须用异常去捕捉了。
2、如果不捕捉异常,你的程序遇到这种情况通常会直接退出,你可以想想看会有什么结果。
3、throw的目的是为了显示异常,但程序又不会因此中止,并且也可以引发你自定义的异常。
4、完美运行的话,就不要去抛出默认的异常,而是显示出更加友好更加详细的错误信息,你可以想想windows本身的异常是什么样的。通常来说,就要识别出不同的异常类型,然后用自定义的异常处理去处理各种可能的情况。你可以尝试将一个exe或者txt之类的文件 ,重命名为.jpg或者.jpg,然后用画图之类的去打开它看看。
5、同第一个问题
为了防止运行时可能出现的异常
为了程序的完整性,异常处理顾名思义是异常,是为了防范于未然。一般出现异常是告知开发者而非直接跟用户相关
首先要搞清楚是throw还是throw XXXXException也就是所谓的封装异常。一些底层的异常一旦被包装,在上层再次引发异常的时候,可能无法直接定位到真实发生异常的地方。故仅使用throw将异常上抛到UI层或最上层
一般你在不确定是否会发生异常的时候需要进行异常捕捉,尤其是对于IO操作时、数值转换、空引用等情况
自定义异常是为了更好的封装的异常,但一般不建议自定义异常,用系统的异常即可
A.给你补充点,如果你是担心异常捕捉会影响性能,如你的第四个问题,‘完美运行的程序’,既然完美,我所理解的是100%不会出异常,那么这个时候你加try-catch跟不加try-catch,性能上来说,几乎无异,只在有异常发生时他们才会凸显出性能上的差异;
B.我个人建议,在必要的地方需要加上异常,在catch里面尽量少逻辑运算而可改用"通知"的方式来进行异常处理。在try块,尽可能将可能引发异常的情况用if等判断语句做下处理,如:
var tempArg = GetOneObj();//tempArg有可能为null,那么如果再进行tempArg.OtherMethod()的调用就会报NullReferenceException的异常,所以可以在调用钱先对tempArg进行判空操作。
C.多写代码,自然而然会理解,建议安装resharper,会对你学习或多或少有一点帮助
既然知道有异常,为什么还要抛出而不直接解决,要留给其他人看呢?
一眼就能看出有问题当然要改正问题 ,try{}catch{}finally{} try放的是有可能出现的错误不是一定会出现异常,我们知道有可能有错但是用户不知道啊 ,所以就要把错误捕获 一Messagebox()或别的的形式返回给用户提示他那里操作有误,这样软件不是更友好嘛。
2013-07-22
2013-07-22