首页 > 系统相关 >windows C#-异常处理

windows C#-异常处理

时间:2024-11-10 20:18:29浏览次数:3  
标签:index windows try C# finally goes catch 异常

C# 程序员使用 try 块来对可能受异常影响的代码进行分区。 关联的 catch 块用于处理生成的任何异常。 finally 块包含无论 try 块中是否引发异常都会运行的代码,如发布 try 块中分配的资源。 try 块需要一个或多个关联的 catch 块或一个 finally 块,或两者皆之。

下面的示例演示 try-catch 语句、try-finally 语句和 try-catch-finally 语句。

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
    // Only catch exceptions that you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}

try
{
    // Code to try goes here.
}
finally
{
    // Code to execute after the try block goes here.
}

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
}
finally
{
    // Code to execute after the try (and possibly catch) blocks
    // goes here.
}

一个不具有 catch 或 finally 块的 try 块会导致编译器错误。

catch 块

catch 块可以指定要捕获的异常的类型。 该类型规范称为异常筛选器。 异常类型应派生自 Exception。 一般情况下,不要将 Exception 指定为异常筛选器,除非了解如何处理可能在 try 块中引发的所有异常,或者已在 catch 块的末尾处包括了 throw 语句。

可将具有不同异常类的多个 catch 块链接在一起。 代码中 catch 块的计算顺序为从上到下,但针对引发的每个异常,仅执行一个 catch 块。 将执行指定所引发的异常的确切类型或基类的第一个 catch 块。 如果没有 catch 块指定匹配的异常类,则将选择不具有类型的 catch 块(如果语句中存在)。 务必首先定位具有最具体的(即,最底层派生的)异常类的 catch 块。

当以下条件为 true 时,捕获异常:

1. 能够很好地理解可能会引发异常的原因,并且可以实现特定的恢复,例如捕获 FileNotFoundException 对象时提示用户输入新文件名。
2. 可以创建和引发一个新的、更具体的异常。

int GetInt(int[] array, int index)
{
    try
    {
        return array[index];
    }
    catch (IndexOutOfRangeException e)
    {
        throw new ArgumentOutOfRangeException(
            "Parameter index is out of range.", e);
    }
}

3. 想要先对异常进行部分处理,然后再将其传递以进行更多处理。 在下面的示例中,catch 块用于在重新引发异常之前将条目添加到错误日志。 

try
{
    // Try to access a resource.
}
catch (UnauthorizedAccessException e)
{
    // Call a custom error logging procedure.
    LogError(e);
    // Re-throw the error.
    throw;
}

还可以指定异常筛选器,以向 catch 子句添加布尔表达式。 异常筛选器表明仅当条件为 true 时,特定 catch 子句才匹配。 在以下示例中,两个 catch 子句均使用相同的异常类,但是会检查其他条件以创建不同的错误消息:

int GetInt(int[] array, int index)
{
    try
    {
        return array[index];
    }
    catch (IndexOutOfRangeException e) when (index < 0) 
    {
        throw new ArgumentOutOfRangeException(
            "Parameter index cannot be negative.", e);
    }
    catch (IndexOutOfRangeException e)
    {
        throw new ArgumentOutOfRangeException(
            "Parameter index cannot be greater than the array size.", e);
    }
}

始终返回 false 的异常筛选器可用于检查所有异常,但不可用于处理异常。 典型用途是记录异常:

public class ExceptionFilter
{
    public static void Main()
    {
        try
        {
            string? s = null;
            Console.WriteLine(s.Length);
        }
        catch (Exception e) when (LogException(e))
        {
        }
        Console.WriteLine("Exception must have been handled");
    }

    private static bool LogException(Exception e)
    {
        Console.WriteLine($"\tIn the log routine. Caught {e.GetType()}");
        Console.WriteLine($"\tMessage: {e.Message}");
        return false;
    }
}

LogException 方法始终返回 false,使用此异常筛选器的 catch 子句均不匹配。 catch 子句可以是通用的,使用 System.Exception后面的子句可以处理更具体的异常类。

Finally 块

finally 块让你可以清理在 try 块中所执行的操作。 如果存在 finally 块,将在执行 try 块和任何匹配的 catch 块之后,最后执行它。 无论是否会引发异常或找到匹配异常类型的 catch 块,finally 块都将始终运行。

finally 块可用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。

在下面的示例中,finally 块用于关闭在 try 块中打开的文件。 请注意,在关闭文件之前,将检查文件句柄的状态。 如果 try 块不能打开文件,则文件句柄仍将具有值 null 且 finally 块不会尝试将其关闭。 或者,如果在 try 块中成功打开文件,则 finally 块将关闭打开的文件。

FileStream? file = null;
FileInfo fileinfo = new System.IO.FileInfo("./file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // Check for null because OpenWrite might have failed.
    file?.Close();
}

标签:index,windows,try,C#,finally,goes,catch,异常
From: https://blog.csdn.net/m0_72813396/article/details/143444728

相关文章

  • windows C#-多态性
    多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。Polymorphism(多态性)是一个希腊词,指“多种形态”,多态性具有两个截然不同的方面:在运行时,在方法参数和集合或数组等位置,派生类的对象可以作为基类的对象处理。在出现此多形性时,该对象的声明类型不再与运行时类型......
  • windows C#-继承
    继承(以及封装和多态性)是面向对象的编程的三个主要特征之一。通过继承,可以创建新类,以便重用、扩展和修改在其他类中定义的行为。其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。派生类只能有一个直接基类。但是,继承是可传递的。如果ClassC派生自ClassB......
  • windows C#-对象
    类或结构定义的作用类似于蓝图,指定该类型可以进行哪些操作。从本质上说,对象是按照此蓝图分配和配置的内存块。程序可以创建同一个类的多个对象。对象也称为实例,可以存储在命名变量中,也可以存储在数组或集合中。使用这些变量来调用对象方法及访问对象公共属性的代码称为客户......
  • windows C#-匿名类型
    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。可结合使用new运算符和对象初始值设定项创建匿名类型。 以下示例显示了用两个名为Amount和......
  • 小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用Se
     前言    最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~小北的青训营XMarsCode技术训练营——AI加码,字节跳......
  • 【优化求解】蚁群算法ACO求解经济损失的航班延误恢复优化问题(目标函数:航班延误成本最
    ......
  • 【CRM系统选型指南:国内八大主流工具比较】
    本文将对十大主流CRM系统进行比较:纷享销客、ZohoCRM、Pipedrive、简信CRM、HubSpotCRM、八百客CRM、金蝶CRM、浪潮CRM、销售易CRM本文将深入评比2024年主流的CRM系统,帮助你了解各系统之间的主要区别、优缺点以及当前的发展趋势。通过详细的比较和分析,为你提供一个清晰的......
  • 【Python知识宝库】快速了解 `isinstance()` 的原理、作用和使用场景
    ......
  • C++实现命令行文本计数统计程序
    附上一位博主写的关于git的使用(个人感觉非常完整,对新手很友好):Git及Tortoisegit下载安装及使用详细配置过程_tortoisegit下载远程代码-CSDN博客 Gitee地址:https://gitee.com/wnmdsqwnhkmc/second-assignment注:本文并不包含主函数,完整代码请移步Gitee路径:[项目>>ConsoleAppl......
  • MDPI之Applied Science word 模板下载
    因为之前找过很多资料,都没有word模板下载的教程,所以在这里留个记号。官网点此一、进入如下页面 二、下拉找到Submissionchecklist在这里有 MicrosoftWord模板和 LaTeX模板(在此处单击或去官网点击即可自行下载)。......