扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章给大家分享的是有关.NET错误与异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、虚拟空间、营销软件、网站建设、安源网站维护、网站推广。在C#中当出现某个特殊的异常错误条件时,就会创建抛出一个异常对象,这个对象包含有助于跟踪问题的信息。.Net提供了许多预定义的异常类,我们下面看看一些常见特别的异常类吧(异常类太多了,这里就介绍几个常见的)。
对于.Net类,一般的异常类System.Exception派生自System.Object,通常不在代码中抛出System.Exception泛型对象,因为他们无法确定错误情况的本质。
在该层次中有两个重要的类,他们派生自System.Exception类:
SystemException------该类用于通常由.NET允许库抛出的异常,或者由几乎所有的应用程序抛出的异常。例如,如果.NET运行库检测到栈已满,他就会抛出StackOverflowException异常。另一方面,如果检测到调用方法时参数不对,就可以在自己的代码中选择抛出ArgumentException异常或其子类。SystemException异常的子类包括表示致命错误和非致命错误的异常。
ApplicationException----在.NET Framework最初的设计中,是打算把这个类作为自定义应用程序异常类的基类的。不过,CLR抛出的一些异常类也派生自这个类。应用程序抛出的异常则派生自SystemException。因此从ApplicationException派生自自定义异常类型没有任何好处,取而代之的是,可以直接从Exception基类派生自定义异常类。
其他可能会用到的异常类包括:
StackOverflowException-------如果分配给栈的内存区域已满,就会抛出这个异常。如果一个方法连续地递归调用自己,就可能发生栈溢出。这一般是一个致命错误,因为它禁止应用程序执行除了中断以外的其他任务。在这种情况下,甚至也不可能执行到finally块。通常用户自己不能处理像这样的错误,而应退出应用程序。
EndOfStreamException-------这个异常通常是因为读到文件末尾而抛出的,流表示数据源之间的数据流。
OverflowException-----如果要在checked上下文中把包含-40的int类型数据强制转换为uint数据,就会抛出这个异常
MemberAccessException----------该类用于处理访问类的成员失败时所引发的异常。失败的原因可能的原因是没有足够的访问权限,也可能是要访问的成员根本不存在(类与类之间调用时常用)
IndexOutOfException-------该类用于处理下标超出了数组长度所引发的异常
try 块包含的代码组成了程序的正常操作部分,但这部分程序可能会遇到某些严重的错误。
catch块包含的代码处理各种错误,这些错误是执行try块中的代码时遇到的问题。这个快可以用来记录错误。
finally快包含的代码清理资源或执行通常要在try块或者catch块末尾执行的其他操作。无论是否抛出异常,都会执行finally块。finally块中防止return语句,编译器会标记一个错误。另外此块可以如果没有需要关闭或者处理的其他操作可以省略此块。
异常处理具有性能含义,在常见的情况下,不应该使用异常处理错误。应尽量编写好避免错误出现的代码。
在异常捕获中,我们可以实现多个catch块来针对不同的错误做出对应的错误处理。下面我们看一个例子:
class Program { static void Main(string[] args) { while (true) { try { string userInput; Console.WriteLine("请输入0-5之间任意一个数字:"); userInput = Console.ReadLine(); if (string.IsNullOrWhiteSpace(userInput)) { break; } if (int.TryParse(userInput, out int index)) { if (index < 0 || index > 5) { throw new IndexOutOfRangeException($"你输入的数字是{index}"); } Console.WriteLine($"你输入的数字是{index}"); } else { throw new Exception("请输入数字"); } } catch (IndexOutOfRangeException ex) { Console.WriteLine($"你输入的数字不在此范围内.{ex.Message}"); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("谢谢合作"); } } } }
在此事例中,定义了两个catch块。如果输入的超过规定返回的数字,则会抛出超出范围的错误也就进入对应的catch块。而输入的非数字也就进入了另外一个catch块进行处理。
下面我们看一看关于System.Exception属性。熟悉了解其中熟悉能更好的去观察理解抛出的异常错误。
属性 | 说明 |
Data | 这个属性可以给异常添加键/值语句,以提供关于异常的额外信息 |
HelpLink | 连接到一个帮助文件上,以提供关于该异常的更多信息 |
InnerException | 如果此异常是在catch块中抛出的,它就会包含把代码发送到catch块的异常对象 |
Message | 描述错误情况的文本 |
Source | 导致异常的应用程序名或对象名 |
StackTrace | 栈上方法调用的详细信息,它有助于跟踪抛出异常的方法 |
Hresult | 分配给异常的一个数值 |
TargetSite | .NET反射对象,描述了抛出异常的方法 |
自从C#6开始就支持异常过滤器。Catch块仅在过滤器但会true时执行。捕获不同的异常类型时,可以有行为不同的代码块。在某些情况下,catch块基于异常的内容执行不同的操作。下面我们看下如何来使用异常过滤器吧:
public class MyIndexOutOfException :SystemException { public MyIndexOutOfException(string message) : base(message) { } public int ErrorCode { get; set; } } class Program { static void Main(string[] args) { try { int steInput = 12; if (steInput > 10) { throw new MyIndexOutOfException("数据超出了范围") { ErrorCode = 1 }; } } catch (MyIndexOutOfException ex) when (ex.ErrorCode!=1) { Console.WriteLine("出现了自定义错误"); } catch (MyIndexOutOfException ex) when (ex.ErrorCode == 1) { Console.WriteLine(ex.Message); } catch (Exception ex) { throw; } } }
上面例子中,自定义了一个异常处理,同事增加ErrorCode,以此啦作为过滤条件,利用关键字When+条件来进行过滤。
感谢各位的阅读!关于“.NET错误与异常处理机制的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流