unity C# 中一看就会的try-catch-finally、throw

发布时间:2024年01月04日


C# 异常处理是一种用于捕获和处理程序运行时错误的机制,它允许程序在遇到不可预见或非正常条件时进行优雅地恢复或失败。C# 中的异常处理基于 try-catch-finally 结构,并且所有异常类都派生于 System.Exception 类。

1、C# 异常处理原理:

  1. try 块:包含可能会抛出异常的代码。如果在这部分代码中发生异常,控制权会立即转移到相应的 catch 块。
try
{
    // 可能会抛出异常的代码
    int result = Divide(10, 0); // 示例:除以零异常
}
  1. catch 块:用于捕获特定类型的异常。可以有多个 catch 块来捕获不同类型的异常,按照从最具体到最一般的顺序排列。
catch (DivideByZeroException ex) // 捕获除以零异常
{
    Console.WriteLine("Error: Division by zero occurred.");
}

catch (ArithmeticException ex) // 捕获其他算术异常
{
    Console.WriteLine("Error: An arithmetic error happened.");
}

catch (Exception ex) // 捕获所有未被前面 catch 块捕获的异常
{
    Console.WriteLine("A general exception was caught: " + ex.Message);
}
  1. finally 块:无论是否发生异常,都会执行这部分代码。通常用于资源清理(如关闭文件、数据库连接等)。
finally
{
    Console.WriteLine("This block is always executed after the try-catch blocks.");
}

2、C# 异常处理实用案例(简化版示例):

  1. 文件操作:

    • 打开文件时捕获 FileNotFoundException。
    try
    {
        using (StreamReader reader = new StreamReader("non_existent_file.txt"))
        {
            string content = reader.ReadToEnd();
        }
    }
    catch (FileNotFoundException ex)
    {
        Console.WriteLine($"File not found: {ex.FileName}");
    }
    
  2. 数据库查询:

    • 处理 SQL 查询引发的 SqlException。
    try
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, connection);
            connection.Open();
            command.ExecuteNonQuery();
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine("SQL Error: " + ex.Message);
    }
    
  3. 网络请求:

    • 使用 HttpClient 进行网络调用时捕获 HttpRequestException。
    try
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync("http://example.com/notfound");
            response.EnsureSuccessStatusCode();
        }
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine("Network request failed: " + ex.Message);
    }
    
  4. 非法参数检查:

    • 检查方法传入的参数是否有效,若无效则抛出自定义异常。
    public void ProcessData(int input)
    {
        if (input < 0)
        {
            throw new ArgumentException("Input must be non-negative.");
        }
    
        try
        {
            // 正常处理逻辑
        }
        catch (Exception ex)
        {
            // 其他内部异常处理
        }
    }
    
  5. 资源清理:

    • 使用 finally 来确保流或连接始终关闭。
    Stream stream = null;
    try
    {
        stream = File.OpenRead("important_file.bin");
        // 对文件流的操作...
    }
    catch (IOException ex)
    {
        Console.WriteLine("IO Error: " + ex.Message);
    }
    finally
    {
        stream?.Dispose(); // 或者使用 'using' 语句代替 finally 块
    }
    

3、throw关键字

throw 关键字用于显式抛出一个异常对象。当你在代码中遇到错误条件或不满足预期的情况时,可以使用 throw 来创建并抛出一个异常。
csharp
throw new ArgumentException(“Invalid argument provided.”);
当你执行 throw 语句时,它会立即停止当前方法的执行,并开始寻找合适的异常处理结构(即 catch 块),从当前方法的调用者开始向上遍历调用栈。

总结一下 throw 和 catch 的区别与用途:

throw:用于启动异常传播过程,强制程序暂停正常执行流程并转而处理错误情况。
catch:用于接收和管理由 throw 引发的异常,提供了一种机制来应对程序运行时出现的问题,确保程序不会因未处理的异常而意外终止,同时能够针对性地执行错误恢复逻辑。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

?最后我们放松一下眼睛
在这里插入图片描述

文章来源:https://blog.csdn.net/qqrrjj2011/article/details/135385828
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。