C# - C Sharp: try-finally


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Bằng cách sử dụng một khối finally, bạn có thể dọn sạch mọi tài nguyên được phân bổ trong khối try và bạn có thể chạy code ngay cả khi có ngoại lệ xảy ra trong khối try. Thông thường, các câu lệnh của một khối finally chạy khi điều khiển rời khỏi khối try. Việc chuyển quyền điều khiển có thể xảy ra do thực thi bình thường, thực thi một break, continue, goto hoặc câu lệnh return hoặc truyền một ngoại lệ ra khỏi câu lệnh try.

Trong một ngoại lệ được xử lý, khối finally liên kết được đảm bảo vẫn chạy bình thường. Tuy nhiên, nếu ngoại lệ không được xử lý, việc thực thi khối finally sẽ phụ thuộc vào cách ngoại lệ được kích hoạt. Điều này phụ thuộc vào cách máy tính của bạn được thiết lập. Các trường hợp duy nhất mà khối finally đề không chạy liên quan đến việc chương trình bị dừng ngay lập tức. Một ví dụ về điều này là khi InvalidProgramException bị ném do các câu lệnh IL bị hỏng. Trên hầu hết các hệ điều hành, việc dọn dẹp tài nguyên hợp lý sẽ diễn ra như một phần của quá trình dừng và dỡ tải.

Thông thường, khi một ngoại lệ chưa được xử lý kết thúc một ứng dụng, việc khối finally có được chạy hay không không quan trọng. Tuy nhiên, nếu bạn có các câu lệnh trong một khối finally phải được chạy ngay cả trong tình huống đó, thì một giải pháp là thêm một khối catch vào câu lệnh try-finally. Ngoài ra, bạn có thể bắt ngoại lệ có thể được đưa vào khối try của câu lệnh try-finally ở vị trí cao hơn trong ngăn xếp cuộc gọi. Nghĩa là, bạn có thể bắt ngoại lệ trong phương thức gọi phương thức chứa câu lệnh try-finally hoặc trong phương thức gọi phương thức đó hoặc trong bất kỳ phương thức nào trong ngăn xếp lời gọi. Nếu ngoại lệ không được bắt, việc thực thi khối finally phụ thuộc vào việc hệ điều hành có chọn kích hoạt thao tác gỡ bỏ ngoại lệ hay không.

Ví dụ

Trong ví dụ sau, một câu lệnh chuyển đổi không hợp lệ gây ra một ngoại lệ System.InvalidCastException. Ngoại lệ chưa được xử lý.

public class ThrowTestA
{
    public static void Main()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Chuyển đổi không hợp lệ; obj chứa một chuỗi, không phải số.
            i = (int)obj;

            // Câu lệnh sau không chạy.
            Console.WriteLine("WriteLine o cuoi khoi try.");
        }
        finally
        {
            // Nhấn CTRL+F5.
            // Rồi nhấn Cancel trong hộp thoại.
            Console.WriteLine("\nViec thuc thi khoi finally sau mot loi khong duoc xy ly\n" +
                "phu thuoc vao cach ngoai le duoc kich hoat.");
            Console.WriteLine("i = {0}", i);
        }
    }
    // Output:
    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
    //
    // Viec thuc thi khoi finally sau mot loi khong duoc xu ly
    // phu thuoc vao cach ngoai le duoc kich hoat.
    // i = 123
}

Trong ví dụ sau, một ngoại lệ từ phương thức TryCast được bắt trong một phương thức xa hơn trong ngăn xếp lời gọi.

public class ThrowTestB
{
    public static void Main()
    {
        try
        {
            // TryCast phát sinh ngoại lệ không được xử lý.
            TryCast();
        }
        catch (Exception ex)
        {
            // Bắt ngoại lệ không được xử lý trong TryCast.
            Console.WriteLine
                ("Catching the {0} exception triggers the finally block.",
                ex.GetType());

            // Khôi phục ngoại lệ không được xử lý nguyên gốc. Có thể không
            // biết ngoại lệ nào phát sinh, hoặc cách xử lý nó, khi nó hãy
            // ném nó.
            throw;
        }
    }

    static void TryCast()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Chuyển đổi không hợp lệ; obj chứa một string, không phải số.
            i = (int)obj;

            // Câu lệnh sau không chạy.
            Console.WriteLine("WriteLine nằm ở cuối khối try.");
        }
        finally
        {
            // Thông báo rằng khối finally được thực thi, và hiển thị giá trị
            // i mà không được thay đổi.
            Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
        }
    }
    // Output:
    // In the finally block in TryCast, i = 123.

    // Catching the System.InvalidCastException exception triggers the finally block.

    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}
» Tiếp: Các mức khả năng truy cập
« Trước: Một số phím tắt thường dùng trong Visual Studio
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!