C# try catch finally异常处理(Exception)

C# 中try块可以捕获测试代码块中的错误。catch块可以处理错误。finally块无论是否try和catch块出现异常都可以执行代码。本文主要介绍C# try catch finally异常处理(Exception)。

 

1、C# try  catch

try 是一个关键字,用于定义一个代码块,其中包含可能会引发异常的语句。

try语句允许定义要执行的错误代码块。try 块后面可以跟随一个或多个 catch 块和一个可选的 finally

如果在try块中发生错误,则catch语句允许定义要执行的代码块。

catch 是一个关键字,用于定义一个代码块,用于捕获并处理在 try 块中引发的异常。catch 块必须跟随在一个 try 块后面,并且可以有多个 catch 块来捕获不同类型的异常。

trycatch关键字成对出现:

语法

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# 异常类:

  1. System.Exception:所有异常类的基类,是一个通用的异常类型。
  2. System.ArgumentException:当方法接收到无效的参数时引发的异常。
  3. System.NullReferenceException:当尝试访问空对象的属性或方法时引发的异常。
  4. System.IndexOutOfRangeException:当尝试访问数组中不存在的索引时引发的异常。
  5. System.DivideByZeroException:当尝试除以零时引发的异常。
  6. System.IO.IOException:用于表示 I/O 操作期间发生的异常。
  7. System.InvalidCastException:当进行类型转换失败时引发的异常。
  8. 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操作异常。

 

posted @ 2023-03-07 13:13  高小浩upup  阅读(1263)  评论(0)    收藏  举报