c#基础之异常处理

2025-12-13 0 315

一、简介

  异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。
  因此处理这种错误,就称为异常处理。
  引起异常的原因,一般是使用者不正当操作,开发者没有按规范的处理数据、使用技术不当导致的,极少情况是由于.NET内部错误引起的。

二、使用

  C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
  1、try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
  2、catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
  3、finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。
  4、throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。

三、C#中的异常类

 C# 异常是使用类来表示的。
  C# 中的异常类主要是直接或间接地派生于System.Exception.
(1).由System.SystemException派生的异常类型:
  System.AccessViolationException在试图读写受保护内存时引发的异常。
  System.ArgumentException在向方法提供的其中一个参数无效时引发的异常。
  System.Collections.Generic.KeyNotFoundException指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常。
  System.IndexOutOfRangeException访问数组时,因元素索引超出数组边界而引发的异常。
  System.InvalidCastException因无效类型转换或显示转换引发的异常。
  System.InvalidOperationException当方法调用对于对象的当前状态无效时引发的异常。
  System.InvalidProgramException当程序包含无效Microsoft中间语言(MSIL)或元数据时引发的异常,这通常表示生成程序的编译器中有bug。
  System.IO.IOException发生I/O错误时引发的异常。
  System.NotImplementedException在无法实现请求的方法或操作时引发的异常。
  System.NullReferenceException尝试对空对象引用进行操作时引发的异常。
  System.OutOfMemoryException没有足够的内存继续执行程序时引发的异常。
  System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常。
(2).由System.ArgumentException派生的异常类型:
  System.ArgumentNullException当将空引用传递给不接受它作为有效参数的方法时引发的异常。
  System.ArgumentOutOfRangeException当参数值超出调用的方法所定义的允许取值范围时引发的异常。
(3).由System.ArithmeticException派生的异常类型:
  System.DivideByZeroException试图用零除整数值或十进制数值时引发的异常。
  System.NotFiniteNumberException当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。
  System.OverflowException在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常。
(4).由System.IOException派生的异常类型:
  System.IO.DirectoryNotFoundException当找不到文件或目录的一部分时所引发的异常。
  System.IO.DriveNotFoundException当尝试访问的驱动器或共享不可用时引发的异常。
  System.IO.EndOfStreamException读操作试图超出流的末尾时引发的异常。
  System.IO.FileLoadException当找到托管程序却不能加载它时引发的异常。
  System.IO.FileNotFoundException试图访问磁盘上不存在的文件失败时引发的异常。
  System.IO.PathTooLongException当路径名或文件名超过系统定义的最大长度时引发的异常。
(5).其他常用异常类型:
  ArrayTypeMismatchException试图在数组中存储错误类型的对象。
  BadImageFormatException图形的格式错误。
  DivideByZeroException除零异常。
  DllNotFoundException找不到引用的dll。
  FormatException参数格式错误。
  MethodAccessException试图访问私有或者受保护的方法。
  MissingMemberException访问一个无效版本的dll。
  NotSupportedException调用的方法在类中没有实现。
  PlatformNotSupportedException平台不支持某个特定属性时抛出该错误。

四、深入理解

示例:
try
{
//一些处理
}
catch (Exception e)
{
//一些处理
throw e; //CLR认为这里是异常的起始点
}
try
{
//一些处理
}
catch (Exception e)
{
//一些处理
throw; //CLR不会重新设置异常的起始点
}
  设置捕获异常后,再次抛出异常。这种情况很少遇到,一般情况下不会这么处理,但是以上2种方式的处理方式差别很大。
  即当我们抛出一个异常时, CLR会重新设置一个异常起始点。 CLR只记录最近一次异常抛出的位置。
  throwe;  再次引发当前异常,导致CLR重新设置该异常的起始点
  throw;  引发当前位于计算堆栈上的异常对象,但不会导致CLR重新设置异常的起始点。
  C#中使用throw和throw ex抛出异常,但二者是有区别的。
  在C#中推荐使用throw;来抛出异常;throw ex;会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。throw e重新抛出异常,并非转发原来的异常,而会更改包括StackTrace在内的许多异常内部信息;对于调用连很深情况,性能损耗超出想象。

五、Stacktrace(堆栈跟踪)

类:
c#基础之异常处理
网上的代码,记录下以备用
string BuildStackTraceMessage(StackTrace stackTrace)
{
if (stackTrace != null)
{
var frameList = stackTrace.GetFrames();
var realFrameList = frameList.Where(i => i.GetMethod().DeclaringType != this.GetType()
&& i.GetFileLineNumber() > 0);
if (realFrameList.Any())

{
StringBuilder builder = new StringBuilder();
realFrameList = realFrameList.Reverse();
var lastFrame = realFrameList.Last();
builder.AppendFormat(\”源文件:{0}\”, lastFrame.GetFileName()).AppendLine();
builder.AppendFormat(\”行号:{0}\”, lastFrame.GetFileLineNumber()).AppendLine();
builder.AppendFormat(\”方法名:{0}\”,
lastFrame.GetMethod().ToString()).AppendLine();
builder.AppendLine(\”堆栈跟踪:\”);


builder.AppendLine(\”=================================================================\”);
MethodBase method;
foreach (var frame in realFrameList)
{
method = frame.GetMethod();
builder.AppendFormat(\”> {0} 类下的第{1}行 {2} 方法\”,
method.DeclaringType.ToString(), frame.GetFileLineNumber(), method.ToString()).AppendLine();
}


builder.AppendLine(\”=================================================================\”);
return builder.ToString();

}
}
return \”没有堆栈信息\”;
}
C# 获取当前方法的名称空间、类名和方法名称
1.(new StackTrace()).GetFrame(1) // 0为本身的方法;1为调用方法
2.(new StackTrace()).GetFrame(1).GetMethod().Name; // 方法名
3.(new StackTrace()).GetFrame(1).GetMethod().ReflectedType.Name; // 类名
public string GetMethodInfo()
{
string str = \”\”;

//取得当前方法命名空间
str += \”命名空间名:\” + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace + \”\\n\”;

//取得当前方法类全名 包括命名空间
str += \”类名:\” + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + \”\\n\”;

//取得当前方法名
str += \”方法名:\” + System.Reflection.MethodBase.GetCurrentMethod().Name + \”\\n\”; str += \”\\n\”;

//父方法
System.Diagnostics.StackTrace ss = new System.Diagnostics.StackTrace(true);
System.Reflection.MethodBase mb = ss.GetFrame(1).GetMethod();

//取得父方法命名空间
str += mb.DeclaringType.Namespace + \”\\n\”;

//取得父方法类名
str += mb.DeclaringType.Name + \”\\n\”;

//取得父方法类全名
str += mb.DeclaringType.FullName + \”\\n\”;

//取得父方法名
str += mb.Name + \”\\n\”; return str;
}
相关文章:
使用StackTrace堆栈跟踪记录详细日志(可获取行号)
C# 获取当前方法的名称空间、类名和方法名称

文章来源:https://www.cnblogs.com/xcsn/p/8435404.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 c#基础之异常处理 https://www.zuozi.net/36656.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务