关于异常,从我们开始写代码的时候就一直伴随着我们,只是那时候我们没有入门,脑子里没有意识这是个例外。Exception:程序运行过程中出现错误,异常对象:将程序中出现的各种错误封装成对象这种问题”,a:当时我就惊呆了,我看到这个问题也是别人的面经里都提到过,所以没多想。”。q:那告诉我有哪些异常,异常的原因,如何处理。a:空指针,索引超出异常,enen...当时很尴尬,但是被问到异常我回答的这么简单,缺乏思考。在实际工作中,捕获异常、收集和分析异常对于解决问题至关重要。Exception类分析SystemException类继承了Exception。前者是System命名空间中所有其他异常类的基类。捕获异常时,首先看的是Exception对象信息。Exception的重要成员如下图所示。这里写图片描述1.Message属性:异常原因的错误信息}if(this._className==null){this._className=this.GetClassName();}returnEnvironment.GetRuntimeResourceString("Exception_WasThrown",newobject[]{this._className});}}Message属性是只读属性,GetRuntimeResourceString是获取运行时资源字符串。返回的字符串是错误消息或导致异常的空字符串。2.data:其他异常信息的key/value对的集合else_data=newListDictionaryInternal();返回数据;}}3.StackTrace:异常发生前调用的方法的名称和签名publicstaticstringStackTrace{[SecuritySafeCritical]get{newEnvironmentPermission(PermissionState.Unrestricted).Demand();返回GetStackTrace(空,真);}}4.Source属性:包含产生异常的应用程序或对象的名称5.TargetSite属性:抛出当前异常的方法6.GetBaseException方法:返回System.Exception,它是所有异常的“基”类异常类。常见的异常类型有很多,它们都继承自SystemException。这些异常类型大致可以分为以下几种:1.数组集合相关2.成员访问相关3.参数相关4.算术相关5.IO相关6.当然还有其他异常。1.数组集合相关IndexOutOfRangeException类:索引超出范围引起的异常ArrayTypeMismatchException类:数组集合存储的数据类型不正确引起的异常RankException类:维数错误引起的异常2.IO相关异常和IO相关的异常继承自IOException类,该类用于处理文件输入输出操作引起的异常。IOException类的五个直接派生类如下。DirectoryNotFoundException类:找不到指定目录时抛出的异常。FileNotFoundException类:找不到文件时抛出的异常。EndOfStreamException类:处理到达流末尾继续读取数据导致的异常。FileLoadException类:无法加载文件时抛出的异常。PathTooLongException类:文件名过长导致的异常。3、成员访问相关的异常所有成员访问相关的异常都继承自MemberAccessException类,而MemberAccessException类继承自SystemException。FileAccessException:字段成员访问失败引发的异常MethodAccessException:方法成员访问失败引发的异常MissingMemberException:成员不存在引发的异常ArgumentOutOfRangeException:参数不在范围内抛出的异常给定范围ArgumentNullException:当参数为null时抛出的异常(不允许为null)5.ArithmeticException异常类用于处理与算术相关的异常,它的相关子类如下除以0(被除数不能为0)NotFiniteNumberException:浮点数运算中的无穷大或非负值引起的异常6.其他异常NullReferenceException:当对象未被实例化并引用时抛出的异常InvalidOperationException:当方法调用对象的当前状态无效时,抛出异常InvalidCastException:类型转换处理过程中抛出的异常OutOfMemoryException:内存处理不足导致的异常StackOverflowException:堆栈溢出导致的错误异常捕获是c#中提供的trycatch块提供了一种结构化的异常处理方案。所有可能的异常都必须妥善处理。trycatch本身不会影响系统的性能。当没有异常发生时,trycatch不会影响系统。表现。受影响的时间是发生异常的时间。关键字trycatchfinally。先执行try中的语句,如果抛出异常,会被catch捕获。不管有没有异常,finally中的语句都会被执行。另一个不太常用的throw关键字:当出现问题时,程序抛出异常。类程序{staticvoidMain(string[]args){DivideNumberdiv=newDivideNumber();div.DivideMethod(2,0);控制台.ReadKey();}}类DivideNumber{int结果;公共DivideNumber(){结果=0;}publicvoidDivideMethod(inta,intb){try{result=a/b;}catch(DivideByZeroExceptione){Console.WriteLine("异常,被除数不能为0,e.message:"+e.Message);}finally{Console.WriteLine($"{a}除以{b}的结果为"+result);}}}异常处理原则和建议在实际开发中,异常应该怎么写?对系统的稳定性和容错性有一定的要求。捕获具体的异常,我们在捕获异常的时候经常会习惯性的写成catch(Exceptionex)。这不是一个特定的例外。最好具体到ArgumentException和FormatException等异常类。不要抛出"newException()"在catch中什么都不做,应该将异常抛到顶层。这种情况在自己写demo的时候可能比较常见。在catch(Exceptionex)的代码下什么都不做,不要这样。请记住,应该从顶层抛出异常。合理使用finally块。finally关键字的意思是不管抛出什么类型的异常,都会执行。很多时候finally块下可以执行的代码也可以写在catch里。那么finally关键字在什么情况下使用比较合适,比如清理资源、关闭流、回复状态等。必须记录抛出的异常。当然,并非程序中出现的所有异常都必须记录。有些异常还是记录下来,方便具体问题分析。一些日志库log4net,EIF...不只是记录Exception.Message的值,还要记录Exception.ToString()。在前面的例子中,我打印的e.Message只是输出“trytodivideby0”,提示的错误信息不具体,不推荐。Tostring方法包含stacktrace、内部异常信息、Message……通常这些信息比仅仅一条Message更重要。不要将“抛出异常”作为一种函数执行结果。“Throwingexception”应该抛到顶层,但不能作为方法执行结果的类型,方法的结果不能是异常类。每个线程都必须包含一个try/catch块。在创建子线程执行任务时,主线程不会知道子线程的异常情况,所以每个线程都需要tryandcatch。我在担任C#项目的项目经理时,也思考过如何在项目组中有效地实践异常处理。首先,异常处理应该是系统设计规范的一部分,出现在系统设计文档中,而不仅仅是一种技术实现。作为设计文档的一部分,异常处理应侧重于系统容错性和稳定性(如海报所述)。然后,根据这个规约,我们将讨论和选择异常处理中使用的各种技术细节。比如在设计服务的时候,服务的调用接口一定要有异常处理,否则客户端发送任何有害数据都可能导致服务端挂掉。例如,异常的处理必须在系统的设计中明确说明,不能在任何模块中处理异常。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
