2013-05-10 26 views
7

là tốt hơn để ngăn chặn ngoại lệ với một điều khoản bảo vệ hoặc bắt ngoại lệ? Có phương pháp hay nhất? Ưu và nhược điểm của hai phương pháp?Có sử dụng điều khoản bảo vệ hoặc bắt ngoại lệ tốt hơn không?

Ví dụ là tốt hơn này:

try 
{ 
    param=myArray[3]; 
} 
catch (IndexOutOfRangeException e) 
{ 
    do something... 
} 

hay này:

if(myArray.Length < 4) 
{ 
    do something... 
} 
else 
{ 
    param=myArray[3]; 
} 

Cảm ơn tất cả các bạn cho câu trả lời :)

+4

Nếu bạn có thể tránh ngoại lệ, điều đó tốt hơn vì ngoại lệ có phí. –

+1

Nếu bạn đang mong đợi một cái gì đó ở chỉ số 3, đó là một lỗi ** ** nếu bạn không có nó ở đó..nó tốt hơn để đóng ứng dụng của bạn và đăng nhập lỗi đó thay vì bắt ngoại lệ hoặc cố gắng giải quyết nó .. – Anirudha

+0

@Anirudh: Điều gì sẽ xảy ra nếu bạn phân tích cú pháp một tệp được cho là định dạng đúng và các mục sẽ được đặt vào và tìm nạp từ bộ sưu tập dựa trên nội dung trong tệp? Nếu hành động khôi phục chỉ muốn trong trường hợp tệp không hợp lệ là có quy tắc 'ParseFile' ném ngoại lệ cho biết tệp không thể tải được, hãy thử các thao tác khác nhau và bắt bất kỳ ngoại lệ nào xảy ra sẽ có vẻ sạch hơn là có mệnh đề bảo vệ mọi nơi có mục đích duy nhất là ném một ngoại lệ nếu có điều gì đó sai. – supercat

Trả lời

17

tốt hơn là ngăn ngoại lệ với điều khoản bảo vệ hoặc bắt ngoại lệ?

Trong trường hợp ngoại lệ "có tiêu đề" như chỉ mục nằm ngoài phạm vi, luôn là tên cũ.

Trong trường hợp ngoại lệ "ngoại sinh", luôn là ngoại lệ.

Ưu và nhược điểm của hai phương pháp?

Chỉ có nhược điểm của trường hợp sau trong trường hợp ngoại lệ có đầu mối. Chúng là:

  • Ngoại lệ là cực kỳ đắt tiền so với thử nghiệm.
  • Trường hợp ngoại lệ được thiết kế để mô hình đặc biệt hiếm hoi tình huống luồng điều khiển; nếu có khả năng truy cập vào một chỉ mục nằm ngoài phạm vi là bình thường thì không viết xử lý ngoại lệ.
  • Trường hợp ngoại lệ được báo cáo là ngoại lệ "cơ hội đầu tiên" đối với người nghe ngay cả khi ngoại lệ được xử lý. Nhiều hệ thống - ví dụ: - lắng nghe các ngoại lệ cơ hội đầu tiên, ghi lại tất cả các trường hợp đó và xử lý các thành phần tạo ra nhiều trường hợp như lỗi, vì chúng là. (Tôi đã từng giới thiệu một ngoại lệ cơ hội đầu tiên có chủ ý trong một đường dẫn mã phổ biến trong ASP và một ngày sau đó cậu bé đã nghe về nó. Các thử nghiệm hệ thống con bị lỗi phát điên.)
  • Có một số ngoại lệ mà tôi gọi là ngoại lệ "có tiêu đề" - không có tham số, chỉ mục ngoài phạm vi, v.v. - vì chúng rất dễ tránh và cho biết lỗi nên rõ ràng nguy hiểm đến mức chúng luôn luôn được coi là lỗi nghiêm trọng và không bao giờ được xử lý (trừ khi "trình xử lý" đang ghi nhật ký chúng trước khi tắt quá trình.) Không xử lý lỗi, xóa lỗi.

Cuối cùng, bạn nên đọc bài viết của tôi về chủ đề này.

http://ericlippert.com/2008/09/10/vexing-exceptions/

+0

Tôi sử dụng bài đăng của bạn làm hướng dẫn khi viết mã. Tôi ném các ngoại lệ _boneheaded_ bằng cách sử dụng Code Contracts, có các phương thức 'TryX' thay vì ném các ngoại lệ _vexing_, và xử lý tất cả các ngoại lệ _exogenous_. – Virtlink

+0

Điều khoản bảo vệ có thể hữu ích với ngoại lệ ngoại sinh trong trường hợp có cách rẻ để dự đoán với xác suất hợp lý cho dù hoạt động thành công hay thất bại. Ví dụ, nếu một người sẽ viết một tập hợp dữ liệu cho một hoặc nhiều tệp, có thể hữu ích khi kiểm tra không gian đó tồn tại trước khi bắt đầu. Ngay cả khi người ta kiểm tra không gian trước thì người ta vẫn phải chuẩn bị sẵn sàng cho khả năng nó có thể không tồn tại sau đó, nhưng nếu người ta có thể báo cáo một vấn đề trước đó thì nên cố gắng làm như vậy. – supercat

+0

Hoàn hảo cảm ơn bạn! –

17

Sử dụng một điều khoản bảo vệ - bắt ngoại lệ phát sinh cao chi phí thời gian chạy và nói chung để cải thiện khả năng đọc, bạn chỉ nên sử dụng ngoại lệ cho các điều kiện lỗi, không áp dụng cho luồng điều khiển thông thường

+0

đó là một điều kiện lỗi .. nếu anh ta đang mong đợi một cái gì đó tại chỉ số 3 đó là một lỗi nếu anh ta không có nó .. tốt hơn để đóng ứng dụng và đăng nhập lỗi đó .. – Anirudha

+0

@Anirudh Nó phụ thuộc vào tình hình; cả hai * có thể * là chính xác. Nó phụ thuộc vào việc nó được mong đợi rằng mảng có thể không có nhiều giá trị đó hay liệu ứng dụng có hoàn toàn phụ thuộc vào mảng có ít nhất là lớn không. Điều đó xác định xem bạn nên kiểm tra nó hay chỉ để cho nó ném một ngoại lệ. – Servy

+0

@anirudha Tôi tò mò tại sao bạn tiếp tục nói rằng đóng ứng dụng khi loại ngoại lệ này? Các hoạt động có thể được retryable hoặc không đủ nghiêm trọng để đảm bảo tắt ứng dụng. Tại sao không để cho trình xử lý ngoại lệ cấp cao đăng nhập lỗi để bạn có thể quay lại và loại bỏ lỗi? Có nhiều cách thân thiện với người dùng hơn để làm cho nhà phát triển biết về lỗi hơn là giết chết chương trình. – Howiecamp

3

Trong trường hợp ngoại lệ có thể được ngăn chặn, hãy ngăn chặn nó. Luôn luôn.

Đánh bắt và xử lý Ngoại lệ rất tốn kém và không bao giờ được sử dụng cho luồng điều khiển thông thường. Một lính canh rẻ và dễ dàng.

+0

Nó không phụ thuộc vào người bảo vệ là gì? –

+0

@AshBurlaczenko - Bạn sẽ khó ép để tìm một trường hợp mà một người bảo vệ tốn kém hơn so với xử lý Ngoại lệ. –

+0

Xin lỗi, tôi đang đề cập đến phần 'bảo vệ rẻ tiền'. –

4

Điều khoản bảo vệ. Bạn không bao giờ muốn sử dụng try/catch cho luồng điều khiển. Bắt ngoại lệ là tốn kém và nên tránh càng nhiều càng tốt.

+1

Chính xác hơn, nên tránh thử/nắm bắt luồng kiểm soát * bình thường *. –

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