2012-06-25 29 views
10

Đây không phải là 'Cách bắt tất cả ngoại lệ' mà là 'Bạn có nên bắt tất cả ngoại lệ' không? Trong C# .NET tôi đã nhận thấy một số lượng lớn các ngoại lệ. Bạn có nên lên kế hoạch bắt mọi ngoại lệ không?Bạn có nên bắt tất cả ngoại lệ không?

Ví dụ: công cụ xây dựng DirectoryInfo() ném 4 ngoại lệ. Tôi có nên lập kế hoạch bắt những thứ này hay chỉ bắt những cái mà tôi có thể xử lý? Có thể để những người khác bong bóng lên đến Main() nơi tôi có một bản tóm tắt mà sau đó cho người dùng biết có một ngoại lệ không bị bắt. Nó chỉ có vẻ như với tất cả các ngoại lệ có thể của bạn mã của bạn có thể trở thành xử lý ngoại lệ hơn so với mã thực tế.

+0

http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –

+4

Cá nhân, tôi sử dụng 'cuối cùng 'a ** nhiều ** nhiều hơn tôi từng sử dụng' catch' –

+2

@marc: Đó có phải là lý do tôi không thể mở câu hỏi một vài phút trước không? ;) –

Trả lời

14

Chỉ bắt những cái có ý nghĩa để xử lý cho mức trừu tượng mà bạn đang viết mã. Hầu hết các ngoại lệ sẽ chỉ bị bắt ở mức cao hơn nhiều so với nơi chúng bị ném.

Vì vậy, có, bạn chính xác. :)

+3

Điều này. Chỉ xử lý các ngoại lệ mà bạn có thể, xử lý tốt. – hometoast

0

Nói chung, bạn chỉ nên bắt ngoại lệ mà bạn biết cách xử lý. Mục đích của trường hợp ngoại lệ sủi bọt là cho phép các phần khác của mã bắt chúng nếu chúng có thể xử lý chúng, vì vậy việc bắt tất cả các ngoại lệ ở một cấp có thể sẽ không mang lại cho bạn kết quả mong muốn. Ở mức cao nhất, bạn có thể muốn nắm bắt tất cả để cung cấp cho người dùng một thông báo lỗi thân thiện và điều đó sẽ báo hiệu rằng chương trình của bạn đang xử lý sai thứ gì đó và bạn có thể cần tìm ra cách xử lý nó đúng.

Có một số trường hợp (chẳng hạn như OutOfMemoryException), rằng thực sự không có cách nào để xử lý một cách duyên dáng (ngoài lối ra) và bạn chắc chắn nên để những bong bóng đó tối thiểu như giao diện người dùng cho lối ra duyên dáng.

2

Bạn nên bắt ngoại lệ mà bạn đang mong đợi - và thất bại một cách duyên dáng về ngoại lệ mà bạn không mong đợi (bằng cách bắt chúng trong một trình xử lý ngoại lệ chung).

Trong ví dụ của bạn - tạo DirectoryInfo() có thể ném nhiều trường hợp ngoại lệ - nhưng không có lý do bạn không thể chỉ

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed 
} 

Nó có thể là bạn muốn nắm bắt những ngoại lệ an ninh và cung cấp một số mã khác , hãy làm điều đó, nhưng giữ trình xử lý 'trường hợp chung' của bạn

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(SecurityException ex) 
{ 
    // Carry on but use a default path or something etc 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel 
} 
0

Chỉ cần nắm bắt những người bạn có thể và muốn xử lý.
Logic khá đơn giản, bạn sẽ làm gì với phần còn lại của "ném"?
trừ khi có một cái gì đó (logic \ logging \ lỗi tin nhắn) bạn muốn làm và bạn chỉ cần đi lại ném sau đó bạn không có lý do để bắt.

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