try-catch – Tham chiếu C #

Bạn đang xem: thử và nắm bắt là gì

try-catch (C # Reference)

Trong bài viết này

Câu lệnh try-catch bao gồm khối try theo sau là một hoặc nhiều mệnh đề catch , các mệnh đề này chỉ định các trình xử lý cho các ngoại lệ khác nhau.

Khi một ngoại lệ được đưa ra, thời gian chạy ngôn ngữ chung (CLR) sẽ tìm kiếm câu lệnh catch xử lý ngoại lệ này. Nếu phương thức hiện đang thực thi không chứa khối catch như vậy, thì CLR sẽ xem xét phương thức được gọi là phương thức hiện tại và cứ thế lên ngăn xếp cuộc gọi. Nếu không tìm thấy khối catch , thì CLR sẽ hiển thị thông báo ngoại lệ chưa được xử lý cho người dùng và ngừng thực thi chương trình.

Khối try chứa mã được bảo vệ có thể gây ra ngoại lệ. Khối được thực thi cho đến khi một ngoại lệ được ném ra hoặc nó được hoàn tất thành công. Ví dụ: nỗ lực truyền đối tượng null sau đây làm tăng ngoại lệ NullReferenceException :

  object o2 = null;
thử
{
    int i2 = (int) o2; // Lỗi
}
 

Mặc dù mệnh đề catch có thể được sử dụng mà không có đối số để bắt bất kỳ loại ngoại lệ nào, nhưng cách sử dụng này không được khuyến khích. Nói chung, bạn chỉ nên nắm bắt những trường hợp ngoại lệ mà bạn biết cách khôi phục. Do đó, bạn phải luôn chỉ định một đối số đối tượng bắt nguồn từ System.Exception . Loại ngoại lệ phải càng cụ thể càng tốt để tránh chấp nhận sai các ngoại lệ mà trình xử lý ngoại lệ của bạn thực sự không thể giải quyết. Do đó, hãy ưu tiên các ngoại lệ cụ thể hơn loại Exception cơ sở. Ví dụ:

  catch (InvalidCastException e)
{
    // khôi phục từ ngoại lệ
}
 

Có thể sử dụng nhiều mệnh đề catch cụ thể trong cùng một câu lệnh try-catch. Trong trường hợp này, thứ tự của các mệnh đề catch là quan trọng vì các mệnh đề catch được kiểm tra theo thứ tự. Nắm bắt những ngoại lệ cụ thể hơn trước những ngoại lệ ít cụ thể hơn. Trình biên dịch sẽ xảy ra lỗi nếu bạn đặt hàng các khối bắt của mình để không bao giờ đạt được khối sau này.

Sử dụng các đối số catch là một cách để lọc các ngoại lệ mà bạn muốn xử lý. Bạn cũng có thể sử dụng một bộ lọc ngoại lệ để kiểm tra thêm ngoại lệ để quyết định xem có xử lý nó hay không. Nếu bộ lọc ngoại lệ trả về false, thì quá trình tìm kiếm trình xử lý sẽ tiếp tục.

  catch (ArgumentException e) when (e.ParamName == "…")
{
    // khôi phục từ ngoại lệ
}
 

Các bộ lọc ngoại lệ thích hợp hơn để bắt và ném lại (giải thích bên dưới) vì các bộ lọc không hề hấn gì đến ngăn xếp. Nếu một trình xử lý sau đó loại bỏ ngăn xếp, bạn có thể thấy ngoại lệ ban đầu đến từ đâu, thay vì chỉ nơi cuối cùng nó được trồng lại. Một cách sử dụng phổ biến của các biểu thức bộ lọc ngoại lệ là ghi nhật ký. Bạn có thể tạo một bộ lọc luôn trả về giá trị false và cũng xuất ra nhật ký, bạn có thể ghi nhật ký các ngoại lệ khi chúng trôi qua mà không cần phải xử lý chúng và nhập lại.

Câu lệnh ném có thể được sử dụng trong khối catch để ném lại ngoại lệ bị câu lệnh catch bắt. Ví dụ sau trích xuất thông tin nguồn từ ngoại lệ IOException , sau đó ném ngoại lệ vào phương thức mẹ.

  catch (FileNotFoundException e)
{
    // FileNotFoundExceptions được xử lý ở đây.
}
bắt (IOException e)
{
// Trích xuất một số thông tin từ ngoại lệ này, sau đó
// ném nó vào phương thức cha.
if (e.Source! = null)
Console.WriteLine ("Nguồn IOException: {0}", e.Source);
ném;
}
 

Bạn có thể bắt một ngoại lệ và đưa ra một ngoại lệ khác. Khi bạn thực hiện việc này, hãy chỉ định ngoại lệ mà bạn đã bắt gặp làm ngoại lệ bên trong, như thể hiện trong ví dụ sau.

  catch (InvalidCastException e)
{
    // Thực hiện một số hành động ở đây, và sau đó ném một ngoại lệ mới.
    ném YourCustomException mới ("Đặt thông báo lỗi của bạn ở đây.", e);
}
 

Bạn cũng có thể ném lại một ngoại lệ khi một điều kiện đã chỉ định là đúng, như thể hiện trong ví dụ sau.

 catch (InvalidCastException e)
{
    if (e.Data == null)
    {
        ném;
    }
    khác
    {
        // Thực hiện một số hành động.
    }
}
 

Lưu ý

Xem Thêm  Cách sử dụng Sự kiện DOM onclick với JavaScript - thêm onclick vào phần tử javascript

Cũng có thể sử dụng bộ lọc ngoại lệ để nhận được kết quả tương tự theo cách thường rõ ràng hơn (cũng như không sửa đổi ngăn xếp, như được giải thích trước đó trong tài liệu này). Ví dụ sau có một hành vi tương tự cho người gọi như ví dụ trước. Hàm ném InvalidCastException trở lại trình gọi khi e.Data null .

  catch (InvalidCastException e) when (e.Data! = null)
{
    // Thực hiện một số hành động.
}
 

Từ bên trong khối try , chỉ khởi tạo các biến được khai báo trong đó. Nếu không, một ngoại lệ có thể xảy ra trước khi hoàn thành việc thực thi khối. Ví dụ, trong ví dụ mã sau, biến n được khởi tạo bên trong khối try . Cố gắng sử dụng biến này bên ngoài khối try trong câu lệnh Write (n) sẽ tạo ra lỗi trình biên dịch.

  static void Main ()
{
    int n;
    thử
    {
        // Không khởi tạo biến này ở đây.
        n = 123;
    }
    chụp lấy
    {
    }
    // Lỗi: Sử dụng biến cục bộ chưa được gán 'n'.
    Console.Write (n);
}
 

Để biết thêm thông tin về khai thác, hãy xem thử cuối cùng .

Ngoại lệ trong phương thức không đồng bộ

Phương thức không đồng bộ được đánh dấu bằng công cụ sửa đổi async và thường chứa một hoặc nhiều biểu thức hoặc câu lệnh chờ đợi. Biểu thức await áp dụng toán tử await cho Tác vụ hoặc Tác vụ & lt; TResult & gt; .

Khi điều khiển đạt đến await trong phương thức không đồng bộ, tiến trình trong phương thức sẽ bị tạm dừng cho đến khi tác vụ đã chờ hoàn tất. Khi tác vụ hoàn tất, quá trình thực thi có thể tiếp tục trong phương thức. Để biết thêm thông tin, hãy xem Lập trình không đồng bộ với async và đang chờ .

Tác vụ đã hoàn thành mà await được áp dụng có thể ở trạng thái bị lỗi do có một ngoại lệ chưa được xử lý trong phương thức trả về tác vụ. Đang chờ nhiệm vụ ném một ngoại lệ. Một tác vụ cũng có thể kết thúc ở trạng thái bị hủy nếu quá trình không đồng bộ trả về nó bị hủy. Đang chờ một tác vụ bị hủy bỏ sẽ ném một OperationCanceledException .

Để bắt ngoại lệ, hãy đợi tác vụ trong khối try và bắt ngoại lệ trong khối catch được liên kết. Để có ví dụ, hãy xem phần Ví dụ về phương thức không đồng bộ .

Một tác vụ có thể ở trạng thái bị lỗi vì nhiều trường hợp ngoại lệ xảy ra trong phương thức không đồng bộ đã chờ đợi. Ví dụ: nhiệm vụ có thể là kết quả của lệnh gọi đến Task.WhenAll . Khi bạn chờ đợi một nhiệm vụ như vậy, chỉ một trong các ngoại lệ được bắt gặp và bạn không thể đoán được ngoại lệ nào sẽ bị bắt. Ví dụ: hãy xem phần Task.WhenAll example .

Ví dụ

Trong ví dụ sau, khối try chứa lệnh gọi đến phương thức ProcessString có thể gây ra ngoại lệ. Mệnh đề catch chứa trình xử lý ngoại lệ chỉ hiển thị thông báo trên màn hình. Khi câu lệnh ném được gọi từ bên trong ProcessString , hệ thống sẽ tìm kiếm câu lệnh catch và hiển thị thông báo Exception started .

 lớp TryFinallyTest
{
    static void ProcessString (string s)
    {
        if (s == null)
        {
            ném mới ArgumentNullException (paramName: nameof (s), message: "tham số không được null.");
        }
    }

    public static void Main ()
    {
        chuỗi s = null; // Cho mục đích trình diễn.

        thử
        {
            ProcessString (các);
        }
        bắt (Ngoại lệ e)
        {
            Console.WriteLine ("{0} Đã bắt được ngoại lệ.", E);
        }
    }
}
/ *
Đầu ra:
System.ArgumentNullException: Giá trị không được để trống.
   tại ngoại lệ TryFinallyTest.Main () bị bắt.
 * * /
 

Ví dụ về hai khối catch

Trong ví dụ sau, hai khối bắt được sử dụng và ngoại lệ cụ thể nhất, xuất hiện trước, sẽ được bắt.

Để bắt được ngoại lệ cụ thể nhất, bạn có thể thay thế câu lệnh ném trong ProcessString bằng câu lệnh sau: ném ngoại lệ mới () .

Nếu bạn đặt khối bắt ít cụ thể nhất trước trong ví dụ, thông báo lỗi sau sẽ xuất hiện: Một mệnh đề bắt trước đó đã bắt tất cả các ngoại lệ của loại này hoặc một loại siêu ('System.Exception') .

 class ThrowTest3
{
    static void ProcessString (string s)
    {
        if (s == null)
        {
            ném mới ArgumentNullException (paramName: nameof (s), thông báo: "Tham số không được rỗng");
        }
    }

    public static void Main ()
    {
        thử
        {
            chuỗi s = null;
            ProcessString (các);
        }
        // Cụ thể nhất:
        bắt (ArgumentNullException e)
        {
            Console.WriteLine ("{0} Bắt được ngoại lệ đầu tiên.", E);
        }
        // Ít cụ thể:
        bắt (Ngoại lệ e)
        {
            Console.WriteLine ("{0} Đã bắt được ngoại lệ thứ hai.", E);
        }
    }
}
/ *
 Đầu ra:
 System.ArgumentNullException: Giá trị không được để trống.
 tại Test.ThrowTest3.ProcessString (String s) ... Đã bắt được ngoại lệ đầu tiên.
* /
 

Ví dụ về phương thức không đồng bộ

Ví dụ sau minh họa việc xử lý ngoại lệ cho các phương thức không đồng bộ. Để bắt một ngoại lệ mà tác vụ không đồng bộ ném ra, hãy đặt biểu thức await trong khối try và bắt ngoại lệ trong khối catch . < / p>

Bỏ ghi chú dòng ném ngoại lệ mới trong ví dụ để minh họa việc xử lý ngoại lệ. Thuộc tính IsFaulted của tác vụ được đặt thành True , thuộc tính Exception.InnerException của tác vụ được đặt thành ngoại lệ và ngoại lệ được bắt trong < mã> bắt khối.

Bỏ ghi chú dòng ném OperationCanceledException mới để chứng minh điều gì sẽ xảy ra khi bạn hủy một quy trình không đồng bộ. Thuộc tính IsCanceled của tác vụ được đặt thành true và ngoại lệ được bắt trong khối catch . Trong một số điều kiện không áp dụng cho ví dụ này, thuộc tính IsFaulted của nhiệm vụ được đặt thành true IsCanceled được đặt thành false .

 public async Task DoSomethingAsync ()
{
    Tác vụ & lt; string & gt; theTask = DelayAsync ();

    thử
    {
        string result = await theTask;
        Debug.WriteLine ("Kết quả:" + kết quả);
    }
    bắt (Exception ex)
    {
        Debug.WriteLine ("Thông báo ngoại lệ:" + ex.Message);
    }
    Debug.WriteLine ("Task IsCanceled:" + theTask.IsCanceled);
    Debug.WriteLine ("Task IsFaulted:" + theTask.IsFaulted);
    if (theTask.Exception! = null)
    {
        Debug.WriteLine ("Thông báo Ngoại lệ Tác vụ:"
            + theTask.Exception.Message);
        Debug.WriteLine ("Thông báo ngoại lệ nhiệm vụ bên trong:"
            + theTask.Exception.InnerException.Message);
    }
}

Tác vụ không đồng bộ riêng tư & lt; string & gt; DelayAsync ()
{
    chờ đợi Task.Delay (100);

    // Bỏ ghi chú mỗi dòng sau thành
    // chứng minh xử lý ngoại lệ.

    // ném mới OperationCanceledException ("bị hủy");
    // ném mới Exception ("Đã xảy ra chuyện.");
    return "Đã xong";
}

// Kết quả khi không có ngoại lệ nào được ném vào phương thức đã chờ:
// Kết quả: Xong
// Tác vụ bị hủy: Sai
// Task IsFaulted: False

// Kết quả khi một Ngoại lệ được ném vào phương thức được chờ đợi:
// Thông báo ngoại lệ: Đã xảy ra sự cố.
// Tác vụ bị hủy: Sai
// Task IsFaulted: True
// Thông báo ngoại lệ tác vụ: Đã xảy ra một hoặc nhiều lỗi.
// Thông báo ngoại lệ nhiệm vụ: Đã xảy ra sự cố.

// Xuất ra khi một OperationCanceledException hoặc TaskCanceledException
// được ném vào phương thức được chờ đợi:
// Thông báo ngoại lệ: đã hủy
// Task IsCanceled: True
// Task IsFaulted: False
 

Ví dụ về Task.WhenAll

Ví dụ sau minh họa việc xử lý ngoại lệ trong đó nhiều tác vụ có thể dẫn đến nhiều ngoại lệ. Khối try đang chờ tác vụ được trả về bằng lệnh gọi đến Task.WhenAll . Nhiệm vụ hoàn thành khi ba tác vụ được áp dụng WhenAll hoàn tất.

Mỗi nhiệm vụ trong số ba tác vụ đều gây ra một ngoại lệ. Khối catch lặp qua các ngoại lệ, được tìm thấy trong thuộc tính Exception.InnerExceptions của tác vụ được trả về bởi Task. Khi nào tất cả .

 public async Task DoMultipleAsync ()
{
    Tác vụ theTask1 = ExcAsync (thông tin: "Nhiệm vụ đầu tiên");
    Tác vụ theTask2 = ExcAsync (thông tin: "Nhiệm vụ thứ hai");
    Tác vụ theTask3 = ExcAsync (thông tin: "Nhiệm vụ thứ ba");

    Task allTasks = Task.WhenAll (theTask1, theTask2, theTask3);

    thử
    {
        chờ đợi tất cả các Nhiệm vụ;
    }
    bắt (Exception ex)
    {
        Debug.WriteLine ("Ngoại lệ:" + ex.Message);
        Debug.WriteLine ("Task IsFaulted:" + allTasks.IsFaulted);
        foreach (var inEx trong allTasks.Exception.InnerExceptions)
        {
            Debug.WriteLine ("Task Inner Exception:" + inEx.Message);
        }
    }
}

private async Task ExcAsync (chuỗi thông tin)
{
    chờ đợi Task.Delay (100);

    ném Exception mới ("Error-" + thông tin);
}

// Đầu ra:
// Ngoại lệ: Lỗi-Tác vụ Đầu tiên
// Task IsFaulted: True
// Tác vụ Nội ngoại lệ: Lỗi-Nhiệm vụ đầu tiên
// Tác vụ Nội ngoại lệ: Lỗi-Nhiệm vụ thứ hai
// Tác vụ Nội ngoại lệ: Lỗi-Nhiệm vụ thứ ba
 

Đặc tả ngôn ngữ C #

Để biết thêm thông tin, hãy xem phần Tuyên bố thử trong phần đặc tả ngôn ngữ C # .

Xem thêm


Xem thêm những thông tin liên quan đến chủ đề thử và nắm bắt là gì

Tập 256 : Khoảng 2 Năm Trước Tại Đây Đã Có 2 Người Tử Vong Vì Bị Rắn Độc Cắn | Mười Thương Săn Bắt

  • Tác giả: Mười Thương Săn Bắt
  • Ngày đăng: 2022-06-19
  • Đánh giá: 4 ⭐ ( 2344 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tập 256 : Khoảng 2 Năm Trước Tại Đây Đã Có 2 Người Tử Vong Vì Bị Rắn Độc Cắn | Mười Thương Săn Bắt
    Chào mừng bạn đến với kênh " Mười Thương Săn Bắt "
    Mười Thương Săn Bắt là chuỗi video trãi nghiệm, khám phá thiên nhiên hoang dã Miền Tây Nam Bộ. Đến với Kênh bạn sẽ có cơ hội xem những video về Săn Bắt, Hái Lượm.......đầy chân thật của bà con nơi đây. Đồng thời giúp các bạn có thêm kiến thức và trãi nghiệm thực tế đầy thú vị trong mỗi video các bạn đang xem.
    - Hotline: 0375290289 Tân
    Cám ơn các bạn đã xem video và kênh của mình
    sanbattv sanbat muoithuongsanbat

Lý thuyết nắm bắt là gì?

  • Tác giả: vietnamfinance.vn
  • Đánh giá: 4 ⭐ ( 5038 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: (VNF) - Cùng VietnamFinance tìm hiểu Lý thuyết nắm bắt (capture theory) là gì?

Các thể loại chụp ảnh, bạn đã biết được bao nhiêu?

  • Tác giả: achaumedia.vn
  • Đánh giá: 5 ⭐ ( 2393 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Việc sở hữu một chiếc máy ảnh DSLR để có thể theo đuổi con đường nhiếp ảnh chuyên nghiệp tìm hiểu những kiến thức cơ bản về các thể loại chụp ảnh.

Nghị luận hãy nắm bắt cơ hội để thành công

  • Tác giả: hoatieu.vn
  • Đánh giá: 5 ⭐ ( 6021 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nghị luận hãy nắm bắt cơ hội để thành công, Mời các bạn cùng tham khảo tổng hợp bài văn mẫu nghị luận hãy nắm bắt cơ hội để thành công trong bài viết sau đây của

Nắm bắt là gì, Nghĩa của từ Nắm bắt | Từ điển Việt - Việt

  • Tác giả: www.rung.vn
  • Đánh giá: 5 ⭐ ( 5220 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Nắm bắt là gì: Động từ nắm được, hiểu được để vận dụng, sử dụng (nói khái quát) nắm bắt tinh thần tác phẩm nắm bắt thị hiếu của khách hàng nắm bắt lấy cơ hội

Ý nghĩa của nắm bắt cơ hội và cách nhận biết cơ hội của mình

  • Tác giả: namchauims.com
  • Đánh giá: 3 ⭐ ( 6420 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Ý nghĩa của việc nắm bắt cơ hội và các cách nhận biết cơ hội của bản thân cũng như giúp bạn thăng tiến trong sự nghiệp - các cách đó có trách nhiệm với bản thân

NẮM BẮT THÔNG TIN Tiếng anh là gì - trong Tiếng anh Dịch

  • Tác giả: tr-ex.me
  • Đánh giá: 5 ⭐ ( 2302 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Dịch trong bối cảnh "NẮM BẮT THÔNG TIN" trong tiếng việt-tiếng anh. ĐÂY rất nhiều câu ví dụ dịch chứa "NẮM BẮT THÔNG TIN" - tiếng việt-tiếng anh bản dịch và động cơ cho bản dịch tiếng việt tìm kiếm.

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

By ads_php