在c#.net开发过程中会遇到程序抛出异常,目前收录了c#日常开发过程中常见的一些异常错误以及处理办法,供大家参考。大致整理了如下异常信息解释以及解决方法。
ArgumentException、AppDomainUnloadedException、ArithmeticException、ArrayTypeMismatchException、BadImageFormatException、CannotUnloadAppDomainException、CodeDomSerializerException、LicenseException、WarningException、ConfigurationException、InstallException、ContextMarshalException、DataException、DBConcurrencyException、SqlException、InvalidPrinterException、RegistrationException、FormatException、IndexOutOfRangeException、InvalidCastException、InvalidOperationException、InternalBufferOverflowException、IOException、ManagementException、NotImplementedException、NotSupportedException、NullReferenceException、OutOfMemoryException、RankException、AmbiguousMatchException、ReflectionTypeLoadException、ServerException、PolicyException、SecurityException、XmlSyntaxException、TimeoutException、SynchronizationLockException、ThreadAbortException、TypeInitializationException、TypeLoadException、TypeUnloadedException、UnauthorizedAccessException、SoapException、XmlSchemaException、XmlException、XsltException、XPathException。
ArgumentException
当向方法提供的参数之一无效时引发的异常。一般是入参数值不符合方法要求,比如非法的ip地址,非法的端口号(端口号一般0-65535)等。细心检查入参数值很容易排查此问题。
AppDomainUnloadedException
当尝试访问已卸载的应用程序域时引发的异常。举例说明一下,以下面的代码为例,我们先创建应用程序域,然后再进行释放,最后在尝试调用已经释放的域。这个时候会引发AppDomainUnloadedException异常。
using System;
using System.Reflection;
using System.Security.Policy;
class ADUnload
{
public static void Main()
{
//Create evidence for the new appdomain.
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
// Create the new application domain.
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence);
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("child domain: " + domain.FriendlyName);
// Unload the application domain.
AppDomain.Unload(domain);
try
{
Console.WriteLine();
// Note that the following statement creates an exception because the domain no longer exists.
Console.WriteLine("child domain: " + domain.FriendlyName);
}
catch (AppDomainUnloadedException e)
{
Console.WriteLine("The appdomain MyDomain does not exist.");
}
}
}
ArithmeticException
当算术、强制转换或转换操作发生错误时引发的异常。并且ArithmeticException 是以下异常的基类,下面列举了可能会引发此异常的几种情况。
- DivideByZeroException,当除数为 0 时,将引发整数除法。 例如,尝试将 10 除以 0 会 DivideByZeroException 引发异常。
- NotFiniteNumberException当对操作执行或返回 Double.NaN、 Double.NegativeInfinity、 Double.PositiveInfinity、 Single.NaN、 Single.NegativeInfinity和 Single.PositiveInfinity编程语言时引发的编程语言不支持这些值。
- OverflowException,当操作的结果超出目标数据类型的边界时,将引发此结果。 也就是说,它小于数字 MinValue 的属性或大于其 MaxValue 属性。 例如,尝试将 200 + 200 分配给值 Byte 会 OverflowException 引发异常,因为 400 大于 256,数据类型的 Byte 上限。
ArrayTypeMismatchException
当尝试在数组内,存储错误类型的元素时引发的异常。即当系统无法将元素转换为数组声明的类型时引发。 例如,类型元素 String 不能存储在Int32数组中 ,因为不支持这些类型之间的转换。
BadImageFormatException
当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。
- 当使用旧版本的.NET工具(如 ILDasm.exe 或 installutil.exe)调用更高版本的 .NET 开发的程序集时会引发此异常。若要解决此异常,请使用对应 .NET版本的工具。
- 当尝试加载不是c#语言写的程序集或可执行文件时会引发此异常。 若要解决此异常,请使用对应的调用方式(如 DllImport、extern)来调用其他语言编写的程序集或可执行程序。
- 当一个可执行程序或者程序集本身是x86平台的,但是以x64的方式加载时,会引发此异常。若要解决此异常,请将项目的目标平台属性设置为x86并重新编译
- 当低版本的.net项目尝试加载高版本的.net程序集或者可执行程序时,会引发异常。若有解决此异常,请将项目的.net版本进行升级或者将程序集或可执行程序的.net版本升级。
CannotUnloadAppDomainException
当尝试卸载应用程序域失败时引发的异常。下面列举了几种会引发CannotUnloadAppDomainException异常的情况。
- 默认应用程序域,必须在应用程序的生存期内保持加载状态。
- 具有无法立即停止执行的正在运行线程的应用程序域。
- 已卸载的应用程序域。
CodeDomSerializerException
当程序序列化遇到错误时,将引发此异常。 此异常使得序列化程序能够返回有关错误的位置和类型的信息。若要解决此异常,请仔细检查序列化内容是否符合规范。
LicenseException
当组件无法获取有效许可证时,调用方法 LicenseManager.Validate 会引发 LicenseException异常。不仅如此当组件未获得许可或者获得许可但许可无效时,都会发生此情况。
WarningException
这个异常可以不做为异常使用,可以理解为是一个警告信息提醒。如果程序没有主动捕获此异常,它将作为警告消息显示给用户。 我们在此类的构造函数中可以指定帮助文件和帮助主题,以便用户获取更多帮助信息。
ConfigurationException
当应用程序尝试读取或写入配置文件但失败时,会引发此异常。原因可能是配置文件中格式不正确、文件权限问题和具有无效值的配置属性值导致的。
InstallException
此异常是在服务安装阶段(提交、回滚、卸载)时发生错误引发的异常。例如在安装运行时需要名称为FileDoesNotExist.txt的文件作为依赖。实际安装时缺失这个文件,那么就会导致InstallException异常。同理在回滚、卸载时有同类情况,也会引发此异常。
ContextMarshalException
当尝试跨上下文边界封送对象时失败会引发此异常。对象可以按值或引用封送。 任何尝试通过跨上下文边界封送的操作都会产生一个 ContextMarshalException异常。
DataException
当使用 ADO.NET 组件发生错误时会引发此异常。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
DBConcurrencyException
在执行数据库插入、更新或删除操作过程中,受影响的行数等于零时引发的异常,此异常通常由并发冲突引起。
SqlException
SQL Server 返回警告或错误时引发的异常。通常是连接数据库服务器时引发或者执行错误的SQL语句引发,当连接数据库服务器时引发此异常,那么我们就应该检查数据库连接字符串内容。若是执行SQL语句时引发,那么就得好好得检查一下SQL语句语法是否有问题,最简单得方式就是把生成出来得SQL语句放到SQL Server管理工具中执行,看下是哪里出了问题。
InvalidPrinterException
当尝使用无效的打印机设置来访问打印机时所引发的异常。最常见的原因就是调用的打印机名称不存在导致的。
RegistrationException
当注册程序集错误时引发的异常。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
FormatException
参数格式无效或复合格式字符串不正确时引发的异常。
- 在对将字符串转换为其他数据类型的方法的调用中, 该字符串不符合所需类型。通常发生在调用Convert类的某些方法和某些类型的
ParseExact
Parse
和方法时引发。 - 将非
true
false
字符串转换成bool类型时会引发此异常。 - 尝试将非法的日期字符串转换成datetime类型时会引发此异常
- 尝试将非法的guid字符串转换成guid类型时会引发此异常
- 尝试将非数值字符串转换成数值类型时会引发此异常
IndexOutOfRangeException
这个异常很常见,一般是访问索引超出界限时引发的异常。例如数组arr的长度为3,代码中arr[3]是会引发数组下标越界异常的,因为在.net中,数组下标是从0开始的(0,1,2共三个元素),如果想取第三个元素,那么应该是arr[2]。
InvalidCastException
当执行了无效的强制转换或显式转换时引发的异常。例如将字符串abc
转换为int数值类型。
InvalidOperationException
当方法调用对于对象的当前状态无效时引发的异常。常见的场景有下面几种。
- IEnumerator.MoveNext循环时,移除集合内的元素会引发此异常,最常见的就是在foreach循环中删除被循环数组的元素。
- 读取资源文件时在进行方法调用之前关闭资源集会引发此异常。
- 当添加的对象将导致结构生成结构不正确的XML文档时,会引发此异常。
- 尝试从不是主线程或UI线程的线程操作 UI控件时会引发此异常,解决方法见 C#中使用Invoke和BeginInvoke跨线程更新UI控件示例代码 - 实用工具_软件教程_.net_c#-有码挺好个人博客 (cisharp.com)
InternalBufferOverflowException
内部缓冲区溢出时引发的异常。
IOException
IOException 是在使用流、文件和目录访问信息时引发的异常的基类。一般在操作文件时发生 I/O 错误所引发的异常。
ManagementException
调用计算机管理模块时异常。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
NotImplementedException
调用没有实现的方法或操作时引发的异常。最常见的就是继承接口后vs编译器会自动实现抛出NotImplementedException异常的方法,如果不进行改写则会引发此异常。
NotSupportedException
当调用的方法不受支持时或者尝试读取、搜索或写入不支持所调用功能的内存流时都会引发此异常。大多数情况下NotSupportedException异常表示被调用的方法没有实现,开发者不应调用此方法。
NullReferenceException
当对象为null时,尝试调用该对象内的属性或方法会抛出此异常,建议调用之前加非空判断以加强程序健壮性。
OutOfMemoryException
没有足够的内存继续执行程序时引发的异常。通常在图片处理、大文件处理过程中容易出现,建议分段分片处理解决此异常。我们在写容易大量消耗系统资源的代码时,应当使用using字段或者及时释放对象资源规避此异常。
RankException
将错误维度的数组传入方法时引发的异常。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
AmbiguousMatchException
当绑定的成员导致多个成员匹配绑定条件时引发的异常,或者多个成员与传递给反射方法的绑定条件匹配时,此异常。 例如:在反射中Type.GetMethod、Type.GetProperty返回多个满足条件的方法或属性时,会引发此异常。
ReflectionTypeLoadException
当反射加载程序集时,未找到它依赖程序集会引发此异常。解决办法就是找齐它所有依赖程序集并放在执行目录下。
ServerException
当客户端无法连接到远程计算机时,会引发该异常,以向客户端传达错误。
PolicyException
当请求的权限超过策略将授予的权限或策略配置为禁止运行时,会引发此异常。
SecurityException
在检测到安全性错误时引发的异常。当调用方没有访问资源所需的权限时,将引发异常。
XmlSyntaxException
在 XML 语法分析中出现语法错误时引发的异常,通常是尝试加载不正确xml文件导致。
TimeoutException
当为进程或操作分配的时间已超时时引发的异常。
SynchronizationLockException
Monitor一般都会使用引用对象当做锁对象。但是当Monitor的锁对象不一致时,就会抛出SynchronizationLockException异常。
ThreadAbortException
当对Thread现场Abort销毁时引发的异常。
TypeInitializationException
当类的初始化类型失败时,将创建一个TypeInitializationException,并向其传递对由该类型的类初始值设定项引发的异常的引用。 InnerException保存基础异常的属性TypeInitializationException。
TypeInitializationException 异常反映了程序灾难性情况。 因此,除了可能用于对调试代码进行故障排除外,不应依赖于 try、catch 处理异常。 相反,应当及时分析调查找出根源所在并解决问题。
TypeLoadException
TypeLoadException 是公共语言运行时找不到程序集或程序集中的类型或无法加载时引发。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
TypeUnloadedException
尝试访问已卸载的类时所引发的异常。
UnauthorizedAccessException
当操作系统因 I/O 错误或指定类型的安全错误而拒绝访问时所引发的异常。具体异常内容可查看InnerException或Message属性查看详情并分析解决。
SoapException
待收录
XmlSchemaException
待收录
XmlException
待收录
XsltException
待收录
XPathException
待收录