C# try catch finally异常处理(Exception)
1、C# try catch
try 是一个关键字,用于定义一个代码块,其中包含可能会引发异常的语句。
try语句允许定义要执行的错误代码块。try 块后面可以跟随一个或多个 catch 块和一个可选的 finally 块
如果在try块中发生错误,则catch语句允许定义要执行的代码块。
catch 是一个关键字,用于定义一个代码块,用于捕获并处理在 try 块中引发的异常。catch 块必须跟随在一个 try 块后面,并且可以有多个 catch 块来捕获不同类型的异常。
try和catch关键字成对出现:
语法
try
{
// 可能会引发异常的代码
}
catch (Exception ex)
{
// 处理异常
Console.WriteLine("发生了异常:" + ex.Message);
}
finally
{
// 必须要执行的代码
Console.WriteLine("执行 finally 块中的代码。");
}
考虑以下示例:
这将产生一个错误,因为myNumbers[10]不存在。输出将是这样的:
using System;
namespace cjavapy
{
public class Trycatch
{
public static void Main(string[] args)
{
int[] myNumbers = { 1, 2, 3 };
Console.WriteLine(myNumbers[8]); // 不存在会报错!
}
}
}
如果发生错误,我们可以使用try catch来捕获错误并执行一些代码来处理该错误:
例如:
using System;
namespace cjavapy
{
public class Trycatch
{
public static void Main(string[] args)
{
try
{
int[] myNumbers = { 1, 2, 3 };
Console.WriteLine(myNumbers[8]);
}
catch (Exception e)
{
Console.WriteLine("输出异常信息等其它操作" + e.Message + e.StackTrace);
}
}
}
}
在 catch 块中,我们可以使用 Exception 类型来捕获任意类型的异常。如果需要捕获特定类型的异常,可以使用该异常类型的子类来代替 Exception 类型,例如
try
{
// 可能会引发 DivideByZeroException 异常的代码
int x = 1 / 0;
}
catch (DivideByZeroException ex)
{
// 处理 DivideByZeroException 异常
Console.WriteLine("发生了除以零的异常:" + ex.Message);
}
catch (Exception ex)
{
// 处理其他类型的异常
Console.WriteLine("发生了异常:" + ex.Message);
}
finally
{
Console.WriteLine("执行 finally 块中的代码。");
}
在上述代码中,我们使用两个 catch 块来捕获 DivideByZeroException 和其他类型的异常。如果发生了 DivideByZeroException 异常,则会跳转到第一个 catch 块中进行处理。如果发生了其他类型的异常,则会跳转到第二个 catch 块中进行处理。
2、finally
finally语句可以在try catch之后执行代码,而不管是否在try代码中出现异常:
例如:
using System;
namespace cjavapy
{
public class Trycatch
{
public static void Main(string[] args)
{
try
{
int[] myNumbers = { 1, 2, 3 };
Console.WriteLine(myNumbers[8]);
}
catch (Exception e)
{
Console.WriteLine("输出异常信息等其它操作" + e.Message + e.StackTrace);//StackTrace可以查看报错代码行号,排查错误很有用
}
finally {
Console.WriteLine("执行资源释放等相关代码");
}
}
}
}
3、C# Exceptions
在 C# 中,异常(Exception)是指程序在执行期间产生的错误或意外情况。C# 中的异常是通过异常类的实例来表示的,这些异常类都是从 System.Exception 类派生而来的。当发生异常时,可以使用 try-catch-finally 块来捕获和处理异常。
以下是一些常见的 C# 异常类:
- System.Exception:所有异常类的基类,是一个通用的异常类型。
- System.ArgumentException:当方法接收到无效的参数时引发的异常。
- System.NullReferenceException:当尝试访问空对象的属性或方法时引发的异常。
- System.IndexOutOfRangeException:当尝试访问数组中不存在的索引时引发的异常。
- System.DivideByZeroException:当尝试除以零时引发的异常。
- System.IO.IOException:用于表示 I/O 操作期间发生的异常。
- System.InvalidCastException:当进行类型转换失败时引发的异常。
- System.OutOfMemoryException:当内存不足时引发的异常。
在 C# 中,可以使用 try-catch 块来捕获异常并进行处理。例如:
try
{
// 可能会引发异常的代码
}
catch (Exception ex)
{
// 处理异常
Console.WriteLine("发生了异常:" + ex.Message);
}
在上述代码中,try 块中的代码可能会引发异常。如果确实发生了异常,则程序会跳转到 catch 块中,通过 catch 块中的代码对异常进行处理,并输出异常的信息。
此外,C# 还支持使用 throw 关键字手动引发异常,以及使用自定义的异常类来表示特定的错误情况。
4、throw关键字
throw 是一个关键字,用于手动引发异常。通过使用 throw 关键字,我们可以在代码中显式地引发特定类型的异常,并将控制权转移给调用堆栈中的异常处理程序。
throw语句用于创建抛出自定义错误。
throw语句与异常类型一起使用。 C# 中提供了许多异常类型:
以下是 throw 关键字的基本语法:
throw new ExceptionType("异常消息");
在上述代码中,throw 关键字后面跟随 new 关键字用于创建并引发一个指定类型的异常。可以选择性地提供异常消息作为参数,以便在异常被捕获和处理时提供更多信息。
以下是一个具体的示例:
public int Divide(int x, int y)
{
if (y == 0)
{
throw new DivideByZeroException("除数不能为零");
}
return x / y;
}
在上述示例中,如果除数 y 的值为 0,那么我们使用 throw 关键字来手动引发 DivideByZeroException 异常,并提供异常消息 "除数不能为零"。这样,当调用 Divide 方法时,如果除数为零,将会抛出该异常。
通过使用 throw 关键字,我们可以在需要的时候显式地引发异常,从而向调用者传达错误信息,并通过异常处理机制进行适当的错误处理和纠正。
总之,throw 是 C# 中用于手动引发异常的关键字,它允许我们在代码中明确定义异常情况,并向调用堆栈上传递有关错误的详细信息。
|
异常类 |
描述 |
|
SystemException |
其他用户可处理的异常的基本类 |
|
ArgumentException |
方法的参数是非法的 |
|
ArgumentNullException |
一个空参数传递给方法,该方法不能接受该参数 |
|
ArgumentOutOfRangeException |
参数值超出范围 |
|
ArithmeticException |
出现算术上溢或者下溢 |
|
ArrayTypeMismatchException |
试图在数组中存储错误类型的对象 |
|
BadImageFormatException |
图形的格式错误 |
|
DivideByZeroException |
除零异常 |
|
DllNotFoundException |
找不到引用的DLL |
|
FormatException |
参数格式错误 |
|
IndexOutOfRangeException |
数组索引超出范围 |
|
InvalidCastException |
使用无效的类 |
|
InvalidOperationException |
方法的调用时间错误 |
|
MethodAccessException |
试图访问思友或者受保护的方法 |
|
MissingMemberException |
访问一个无效版本的DLL |
|
NotFiniteNumberException |
对象不是一个有效的成员 |
|
NotSupportedException |
调用的方法在类中没有实现 |
|
NullReferenceException |
试图使用一个未分配的引用 |
|
OutOfMemoryException |
内存空间不够 |
|
PlatformNotSupportedException |
平台不支持某个特定属性时抛出该错误 |
|
StackOverflowException |
堆栈溢出 |
|
SystemException |
运行时产生的所有错误的基类。 |
|
IndexOutOfRangeException |
当一个数组的下标超出范围时运行时引发。 |
|
NullReferenceException |
当一个空对象被引用时运行时引发。 |
|
InvalidOperationException |
当对方法的调用对对象的当前状态无效时,由某些方法引发。 |
|
ArgumentException |
所有参数异常的基类。 |
|
ArgumentNullException |
在参数为空(不允许)的情况下,由方法引发。 |
|
ArgumentOutOfRangeException |
当参数不在一个给定范围之内时,由方法引发。 |
|
InteropException |
目标在或发生在CLR外面环境中的异常的基类。 |
|
ComException |
包含COM类的HRESULT信息的异常。 |
|
SEHException |
封装Win32结构异常处理信息的异常。 |
|
SqlException |
封装了SQL操作异常。 |

浙公网安备 33010602011771号