2009-05-21 20 views
5

Nếu chúng ta muốn bắt các hình thức cụ thể của IOException, hay bất kỳ loại khác như một vấn đề của thực tế, và chúng tôi chỉ cố gắng và bắt một cặp vợ chồng (và xác định kết quả đầu ra dứt khoát cho họ) nóiBạn có bắt được loại Ngoại lệ tổng quát hơn không?

FileNotFoundException
ZipException

nên chúng tôi luôn đường mòn nó đi và bao gồm tất cả các căn cứ với một

catch(IOException e){ 
    e.printStackTrace(); 
} 

và sau đó có thể đi xa hơn nữa và bắt Exception e, hoặc là này một 01.hoàn toàn lãng phí thời gian?

Trả lời

9

Nói chung, bạn chỉ muốn nắm bắt và xử lý các ngoại lệ, bạn có thể làm điều gì đó ở mức thấp. Sau đó, ở một mức độ cao hơn, hãy bắt bất kỳ hệ thống ngoại lệ nào bị lỗi, vì vậy bạn có thể ghi lại các lỗi xảy ra.

2

Phân cấp ngoại lệ cao hơn bạn đang bắt và không xử lý chúng đúng cách hoặc quay lại, bạn càng đặt nhiều vấn đề dưới thảm. Bạn có thể có các lỗi thầm lặng khó theo dõi.

Vì vậy, chỉ bắt ngoại lệ thích hợp và để những người khác vượt qua. Ở cấp cao nhất, bạn có thể nắm bắt tất cả nếu bạn không muốn làm hỏng chương trình của mình, nhưng ít nhất hãy đăng nhập nó. Tuy nhiên đây là cách tiếp cận có vấn đề, vì ứng dụng của bạn có thể ở trạng thái không nhất quán và bạn có thể làm hỏng dữ liệu của mình.

Nhưng để trả lời trực tiếp cho câu hỏi của bạn, IOException có thể ở cấp độ thích hợp. Nó có thể là đủ để biết cho bạn rằng bất cứ vấn đề gì, nó liên quan đến IO, và bạn có thể hành động theo nó. Thật khó để nói mà không có thêm thông tin.

+0

Trạng thái không phù hợp, tôi tin rằng cuối cùng khối luôn thực thi trong Java khi ngoại lệ bay lên ngăn xếp, bất kể ngoại lệ có bị bắt hay không. Vì vậy, ngay cả khi bạn cẩn thận không bắt các ngoại lệ "gây tử vong" để tránh thực thi khi ở trạng thái không nhất quán, bạn không có cách nào để ngăn chặn việc thực thi khối cuối cùng của mình.Vì vậy, IMO đây là một điểm tranh luận trong JRE, trừ khi bạn tránh việc sử dụng các khối cuối cùng, mà có vẻ như một điều khủng khiếp phải từ bỏ. .NET CLR là khác nhau - bạn có tùy chọn để hủy bỏ TRƯỚC KHI cuối cùng các khối chạy nếu có một ngoại lệ chưa được giải quyết. –

1

Giống như một nhà tư vấn giỏi, tôi nói "nó phụ thuộc".

Nói chung trong Java, bạn có ý tưởng rõ ràng về tất cả các ngoại lệ có thể có tại một điểm cụ thể trong mã có thể là. Sẽ không có gì lạ khi thấy ai đó sử dụng

} catch (Exception e){ 
    // log or stack trace 
} 

... bằng nhiều mã ném. Nói chung, mặc dù, bạn không nên bắt một ngoại lệ bạn không biết làm thế nào để xử lý hữu ích. (Không bao giờ, không bao giờ bao giờ, làm catch (Exception x) ;, nghĩa là, chỉ cần vứt bỏ ngoại lệ. Không bao giờ.)

Điều khiển là hỏi "Tôi có thể làm gì với điều này?" Thông thường, một ngoại lệ không thể xử lý tệp có thể được xử lý bằng cách yêu cầu người dùng nơi tệp của anh ấy đã bị xóa. Một ngoại lệ tệp nén khó xử lý hơn. Do đó, bạn có thể muốn có những hành vi riêng biệt.

Mặt khác, nếu đó là chương trình dòng lệnh, bạn có thể không muốn gì hơn là thông báo lỗi trong cả hai trường hợp.

Một số lời khuyên khác; không tạo ra một dấu vết ngăn xếp trong mã "cutomer phải đối mặt" - mã mà một người không lập trình có thể thấy. Nonprogrammers có xu hướng nhìn vào compleities của một dấu vết stack và hoảng sợ. Tốt hơn là dịch ngoại lệ cho một thông báo như "Tên tệp" không tìm thấy. " và, nếu bạn thực sự muốn một dấu vết ngăn xếp, ose đăng nhập để gửi nó để gỡ lỗi cấp đầu ra.

4

Nói chung, bạn chỉ nên bắt ngoại lệ mà bạn sẽ xử lý một cách rõ ràng.

Bạn không nên bắt ngoại lệ, IOException, et. al., trừ khi bạn là một cấp độ thích hợp cao, nơi bạn đang làm mương cuối cùng của bạn bắt để báo cáo một lỗi chung cho người dùng.

0

Bạn không nên nắm bắt chúng ở mọi vị trí có thể, nơi một IOException có thể xảy ra nhưng tiếp tục trong cây cuộc gọi nơi bạn đang chuẩn bị để xử lý các IOExceptions còn lại và ngoại lệ chung.

Chúng tôi sử dụng quy tắc chung, bạn nắm bắt các ngoại lệ cụ thể tại nơi bạn có thể xử lý lỗi và chuyển các số còn lại cho người gọi.

1

Bắt bất kỳ loại ngoại lệ nào cũng không phải là một ý tưởng hay. Có, với tư cách là ngoại lệ gốc, dường như nó cung cấp một lớp "bảo vệ", nhưng điều này là xấu vì một vài lý do:

IOExceptions được chọn. Nếu không có nơi nào trong mã đang ném nó, việc thêm vào một đoạn bắt không cần thiết chỉ che khuất mọi thứ, và có khả năng sẽ làm cho bất cứ ai nhìn vào mã sau đó sẽ nhầm lẫn.

Quan trọng hơn, bạn không bắt ngoại lệ để chỉ khiến chúng biến mất. Nếu họ đã làm, bạn chỉ có thể bọc tất cả các phương pháp của bạn trong (bắt (Exception e) {..}) và được thực hiện với nó. Mã bắt ngoại lệ của bạn phải là nơi bạn quyết định phải làm gì nếu các lỗi đó xảy ra, ví dụ:

catch(FileNotFoundException e) 
{ 
log.error("where's the file?");return null; 
} 
catch(ZipException e) 
{ 
log.error("corrupt");return null; 
} 

Vấn đề là làm cho phương pháp hoạt động tốt trong mọi điều kiện có thể. Người gọi sau đó xử lý, ví dụ, nội dung tập tin hoặc không có nội dung, mà không lo lắng về cách nội dung đã có.

+0

Không phải là một lời khuyên về nó; nhưng khi tôi thấy điều này, tôi nghĩ rằng điều này sẽ gây ra một NPE ở một nơi khác. – sal

3

Nếu nghi ngờ, luôn luôn bắt ngoại lệ cụ thể hơn!

0

Tôi sẽ echo "bắt ngoại lệ cụ thể nhất mà bạn có thể".

Tôi thường xuyên bắt IOException và hiển thị một số loại thông báo "lỗi đọc tệp", sau đó cho phép người dùng chọn tệp khác hoặc bất kỳ tệp nào phù hợp. Nếu tập tin thực sự xấu, có lẽ không có nhiều người dùng có thể làm gì về nó, nhưng ít nhất bạn có thể cho họ biết tập tin là xấu.

Nếu bạn nhận được một FileNotFoundException vấn đề thực sự là gần như chắc chắn rằng người dùng seleected tên tập tin sai hoặc một tên tập tin mã hóa cứng không còn hợp lệ. Tôi thường xuyên hiển thị tin nhắn cho điều đó.

Tôi gần như không bao giờ bắt được "Ngoại lệ". Bạn sẽ làm gì về nó? Có khá nhiều thứ bạn không thể làm để khôi phục từ "đã xảy ra sự cố nhưng không có thêm chi tiết nào". Trong một số ngữ cảnh, tôi cho rằng bạn ít nhất có thể hiển thị thông báo lỗi thay vì chỉ chết, nhưng đó là về nó.

0

Nó phụ thuộc nếu Ngoại lệ cụ thể hơn sẽ hỗ trợ trong quá trình ghi sự cố. Đôi khi, giống như với JMX, nó tốt để chỉ bắt ngoại lệ cha mẹ để tránh một danh sách dài của ngoại lệ con có thể. Ít nhất Java 7 sẽ cho phép chúng ta có thêm một ngoại lệ cho mỗi lần bắt. Điều đó sẽ làm sạch mã khá một chút.

1

Tôi nghĩ rằng đó là vấn đề sở thích cá nhân. Cá nhân, điều này có vẻ không phải là một lựa chọn tốt. Tôi thích có mã có ý nghĩa với tôi với các công cụ thử. Điều này có nghĩa là càng cụ thể càng tốt. Tôi có thể nói:

try{ 
    //Code Here 
} 
catch(FileNotFoundException e){ 
    //Code Here 
} 
Các vấn đề liên quan