2011-07-09 45 views
6

Khi ném ngoại lệ giữa nhiều phương pháp, tất cả các phương pháp có nên ném lại ngoại lệ không? ví dụC# Ngoại lệ ném lại

Method1() 
{ 
    Method2(); 
} 

Method2() 
{ 
    try 
    { 
     // Do something 
    } 
    catch 
    { 
     throw; 
    } 
} 

try 
{ 
    Method1(); 
} 
catch 
{ 
    // Do something about exception that was thrown from Method2() 
} 

Chú ý trong Method1(), tôi không cần phải quấn Method2() trong một khối try, tôi nên được?

Trả lời

8

Bạn không cần phải thử, nắm bắt và rút lại ngoại lệ trừ khi bạn có một số lý do cụ thể để bắt chúng ngay từ đầu. Nếu không, họ sẽ tự động phát ra từ các chức năng cấp thấp hơn, đưa chúng đến hàm mức cao nhất trong mã của bạn. Về cơ bản, bạn có thể nghĩ về chúng như là "được phục hồi" tất cả các con đường lên, mặc dù đây không phải là kỹ thuật những gì đang xảy ra.

Thực tế, hầu hết thời gian bạn thấy khối try/catch được viết, không chính xác. Bạn không nên bắt ngoại lệ trừ khi bạn thực sự có thể xử lý chúng. Nó hoàn toàn vô nghĩa (và thực tế được coi là thực hành không tốt) để bắt ngoại lệ chỉ để phục hồi chúng. Không quấn tất cả mã của bạn trong các khối try.

Lưu ý rằng bằng cách "xử lý", tôi có nghĩa là mã của bạn trong khối catch sẽ thực hiện một số hành động cụ thể dựa trên ngoại lệ cụ thể được ném tới số chính xác điều kiện đặc biệt.
Ví dụ: đối với số FileNotFoundException, bạn có thể thông báo cho người dùng rằng không thể tìm thấy tệp và yêu cầu họ chọn một tệp khác.

Xem my answer here để biết thêm chi tiết và thảo luận kỹ lưỡng về "các phương pháp hay nhất về xử lý ngoại lệ".

9

Bạn không cần phải bọc mọi thứ trong các khối try.

Bạn chỉ nên try khi bạn muốn catch cái gì đó, và bạn nên chỉ catch một cái gì đó trong các trường hợp sau đây:

  • Bạn đã sẵn sàng để xử lý trừ (làm bất cứ điều gì cần phải được thực hiện và đừng để nó lan truyền lên ngăn xếp),
  • Bạn muốn làm điều gì đó với ngoại lệ (ví dụ: ghi nhật ký) trước khi khôi phục lại nó (bằng cách sử dụng dạng không tham số throw),
  • Bạn muốn thêm deta ils ngoại trừ bằng cách gói nó trong một ngoại lệ của riêng bạn (xem bình luận tuyệt vời của Allon Guralnek dưới đây).
+3

+1: súc tích và chính xác. Tôi muốn thêm một lý do nữa không chính xác là 'rethrowing' - bọc một ngoại lệ bên trong một ngoại lệ khác (nhưng luôn giữ nguyên ngoại lệ ban đầu trong InnerException, nếu không bạn sẽ mất thông tin về ngoại lệ ban đầu có thể hỗ trợ gỡ lỗi). Gói có thể cung cấp ngữ cảnh bổ sung mà không thể thực hiện lại, ví dụ: "Không thể lưu một đơn đặt hàng mới cho Khách hàng 843, xem InnerException để biết chi tiết.". –

Các vấn đề liên quan