2008-10-13 38 views
6

Tôi có nên sử dụng phương pháp này lỗi ném:sử dụng đúng cách thử .. bắt

if (isset($this->dbfields[$var])) { 
    return $this->dbfields[$var]; 
} else { 
    throw new FieldNotFoundException($var); 
} 

hay phong cách này:

try { 
    return $this->dbfields[$var]; 
} catch (Exception $e) { 
    throw new FieldNotFoundException($var); 
} 

... hay cái gì khác hoàn toàn?

giải thích nhanh về mã:$this->dbfields là một mảng. isset() kiểm tra xem biến có được đặt hay không, trong trường hợp này, cho dù phần tử mảng có tồn tại hay không.

+0

Với số 2 bạn không thực sự có để ném một ngoại lệ, chỉ cần in ra một trong những bạn bắt. – Rayne

+0

cũng là tiêu chuẩn "mảng khóa không tồn tại" lỗi (mà thậm chí không phải là một ngoại lệ, bây giờ tôi nghĩ về nó), sẽ không có ý nghĩa trong cách tôi đang sử dụng này. – nickf

Trả lời

10

Ví dụ thứ hai là xấu. Bạn đang dùng rất nhiều chi phí để bắt một ngoại lệ khi, như bạn chứng minh, nó chỉ là dễ dàng để ngăn chặn các ngoại lệ ở nơi đầu tiên. Ngoài ra, bạn cũng giả sử bạn biết lý do tại sao ngoại lệ đó bị ném - nếu có một số ngoại lệ khác, như nói hết bộ nhớ hoặc thứ gì đó, bạn đang báo cáo nó là "trường không tìm thấy" ngay cả khi không.

Hãy nhớ rằng try/catch bằng các ngôn ngữ như C++ và Java rất tốn kém vì tất cả trạng thái mà chúng phải lưu và khôi phục. Python, mặt khác, có ngoại lệ rất rẻ và họ tích cực khuyến khích bạn sử dụng try/except để xác thực đơn giản. Nhưng dù vậy, bắt mọi thứ và giả vờ là một loại ngoại lệ vẫn còn tệ.

+0

Bạn đã đánh bại tôi sau 2 giây! – Mark

+0

@Mark - đó là lý do tại sao tôi có hơn 3500 XP; Tôi nhanh chóng trả lời rõ ràng! :-) –

3

Bắt "ngoại lệ" không được, hầu hết thời gian, được coi là một thực hành tốt, trong số hai bạn hiển thị, tôi sẽ sử dụng tùy chọn 1.

Bắt tất cả các trường hợp ngoại lệ có thể ẩn một ngoại lệ khác nhau và mặt nạ nó như một FileNotFoundException.

+0

Bạn nên nghiêm túc xem xét việc viết lại câu đầu tiên. Tôi không tin rằng bắt ngoại lệ là KHÔNG BAO GIỜ thực hành tốt. RẤT RARELY có thể, nhưng không bao giờ. –

+0

Đồng ý! Cảm ơn Jason, tôi đã hơi vội vã – Mark

4
//First let's do the checks. 
if(!isset($this->dbfields[$var])) 
    throw new FieldNotFoundException($var); 
//Now we're in the clear! 
return $this->dbfields[$var]; 
+0

không phải là chính xác ví dụ đầu tiên của tôi là gì? – nickf

+0

Rõ ràng hơn, IMO. – Domenic

+0

Nó sẽ thậm chí còn rõ ràng hơn w/o ý kiến ​​:) –

2

Tôi thích cái đầu tiên, nhưng nếu dbfields [$ var] ném thứ gì đó hợp lý khi bạn truy cập một phần tử không tồn tại, thì tôi chỉ muốn trả lại mà không kiểm tra.

Tôi không đặc biệt thích thay đổi loại ngoại lệ trừ khi tôi có lý do chính đáng - nếu bạn làm như vậy, hãy đảm bảo cố gắng duy trì ngoại lệ ban đầu và theo dõi ngăn xếp.

0

Chỉ cần đọc lại lời giải thích của bạn.

Tôi đoán phương pháp của bạn ở đó trong # 1 sẽ bắt bất kỳ ngoại lệ nào có thể bị ném và chỉ cần trả về một bool. Tôi chắc chắn không thích việc bắt các ngoại lệ chung chung hầu hết thời gian, vì vậy # 2 sẽ không được sự lựa chọn của tôi.

0

"... hoặc cái gì khác hoàn toàn?"

Không tốt lắm, vì vậy một thứ khác sẽ phù hợp.

Sửa phiên bản 2 để nắm bắt ngoại lệ chính xác, không phải mọi ngoại lệ có thể. Đăng bài đó như là tùy chọn 3. Tôi sẽ upvote cái gì đó bắt một ngoại lệ cụ thể thay vì Exception.

0

Điều này còn xa lạ với ngôn ngữ bất khả tri.

Một số ngôn ngữ sẽ không ném lỗi để truy cập vào các lĩnh vực không tồn tại, và mô hình ưa thích phụ thuộc rất nhiều vào việc triển khai của các mảng, bảng biểu, đối tượng, vv

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