2010-01-15 56 views
5

Ok tôi đã phạm tội, tôi đã viết quá nhiều mã như thế nàyRefactor Xử lý ngoại lệ

try { 
    // my code 
} catch (Exception ex) { 
    // doesn't matter 
} 

Bây giờ tôi sẽ dọn dẹp/Refactor này.

Tôi đang sử dụng NB 6.7 và hoàn thành mã hoạt động tốt trên văn bản đầu tiên, thêm tất cả các loại ngoại lệ, vv Khi tôi đã thực hiện mã trên NB không giúp đỡ nhiều hơn.

Bạn có biết cách nói NB xem lại tất cả các loại ngoại lệ và đưa ra đề xuất xử lý chúng và hoàn thành mã lại không?

Trả lời

1

Khi bạn yêu cầu một đề nghị về làm thế nào để xử lý các trường hợp ngoại lệ ...

Có không thường được chấp nhận cách xử lý chúng. Nếu không, bạn đặt cược ngôn ngữ java sẽ ngầm có hành vi đó.

  • Ngoại lệ không phải là ràng buộc mức thấp mà người dùng phải đối phó cho đến khi trình biên dịch đủ thông minh.
  • Trường hợp ngoại lệ là cấu trúc ngôn ngữ cấp cao, được sử dụng để diễn tả ngữ nghĩa "điều gì đó đặc biệt đã xảy ra, mà bạn không muốn kết hợp với mã thông thường; bạn muốn nó được xử lý trong các mã cụ thể".

Exceptions tồn tại trong hai hình thức, bởi thiết kế:

  • Exceptions Kiểm tra phải được thực hiện rõ ràng trong mỗi phương pháp có thể ném chúng.
  • Các ngoại lệ không được kiểm soát (các lớp con của RuntimeException hoặc Lỗi) thường là ẩn.

Ở mỗi cấp mã (phương pháp hoặc chặn), mã phải chọn phải làm gì, trong trường hợp có bất kỳ ngoại lệ nào (ngoại trừ các ngoại lệ không được kiểm soát có thể bỏ qua việc xử lý hoàn toàn). Đây là một lựa chọn trách nhiệm mà thay đổi, không có quyết định có hiệu lực cho tất cả các trường hợp:

  • TRÌNH: Catch nó và xử lý hoàn toàn nó (gọi mã thường không biết điều gì đó đã xảy ra). Phương pháp hiện tại cần phải có trách nhiệm. Đăng nhập stack-trace cho developper có thể hữu ích.
  • BƯỚC: Bắt nó, thực hiện một bước xử lý có liên quan đến mã cục bộ và thử lại (hoặc trả lại một ngoại lệ khác với nguyên bản gốc).
  • IGNORE: chỉ cần để cho nó chịu trách nhiệm về mã gọi điện.

Ngôn ngữ java cho phép bạn có cú pháp cụ thể làm cho dễ dàng hơn để xử lý các trường hợp ngoại lệ, như đánh bắt các ngoại lệ cụ thể theo những tổng quát hơn ...


Thông thường, bạn xem xét trường hợp ngoại lệ trong kiến ​​trúc của bạn, và đưa ra một số quyết định thiết kế. Một số ví dụ (trộn theo những cách độc đáo):

  • chọn để có một quá trình lớp tất cả các trường hợp ngoại lệ ném vào lớp thấp hơn (ví dụ: các dịch vụ giao dịch): đăng nhập cho developper, định vị một số thông tin toàn cầu cho người sử dụng ...
  • cho phép một số ngoại lệ thực hiện một số cuộc gọi phương thức cho đến khi bạn đến mã có ý nghĩa để xử lý (ví dụ: tùy thuộc vào ngoại lệ của bạn, bạn có thể thử lại toàn bộ hoạt động hoặc thông báo cho người dùng ...)
  • v.v.
3

Vấn đề là, trình xử lý bắt tất cả của bạn "xử lý" tất cả ngoại lệ, do đó không cần Netbeans hiển thị thêm bất kỳ gợi ý nào.

Nếu trình xử lý ngoại lệ của bạn đã trống và bạn dự định tái cấu trúc chúng, bạn chỉ có thể tạm thời xóa chúng.

Mẹo: Tự động định dạng mã của bạn, tìm kiếm try và sử dụng làm nổi bật khung để tìm các khối catch phù hợp. Sau đó loại bỏ tất cả các mã xử lý.

Sau đó Netbeans một lần nữa sẽ đề xuất các hành động khác nhau để xử lý các trường hợp ngoại lệ có thể.

PS: Hãy cẩn thận, việc xử lý mặc định Netbeans (tức là chỉ ghi nhật ký) không phải lúc nào cũng là lựa chọn tốt nhất.

+0

Lưu ý, điều này sẽ không hoạt động đối với bất kỳ 'RuntimeException' nào. –

1

tôi chỉ có thể cung cấp cách tiếp cận nhật thực và hy vọng rằng nó hơi tương tự với netbeans:

  1. loại bỏ những điều khoản try/catch -> nhật thực sẽ hiển thị lỗi biên dịch
  2. mẹo nhanh chóng
  3. sử dụng Eclipse để cấu trúc lại đúng báo cáo try/catch (hoặc throw)

Bạn có thể lưu mã xử lý ngoại lệ hiện có của mình để dán vào sau khi tái cấu trúc.

Sửa

Tom đã có một nhận xét rất tốt về RuntimeException. Vì vậy, các thủ tục nên trông đẹp hơn như thế này:

  1. bản mệnh đề bắt hiện có và dán vào một trình soạn thảo notepad/văn bản
  2. loại bỏ những điều khoản try/catch -> nhật thực sẽ hiển thị lỗi biên dịch
  3. sử dụng Eclipse nhanh tip để cấu trúc lại lần thử đúng/catch (hoặc ném) báo cáo
  4. dán mệnh đề catch được lưu trữ ở phần cuối của chuỗi các câu lệnh bắt

này sẽ duy trì xử lý ngoại lệ của bạn Runtime Ngoại lệ (và kiểu con!).

Vì vậy, từ

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (Exception oops) { 
    // catch both IOException and NumberFormatException 
} 

bạn đi đến

try { 
    Integer.parseInt("Force a RuntimeException"); 
    myInputStream.close(); 
} catch (IOException oops) { 
    // catch IOException 
} catch (Exception oops) { 
    // catch NumberFormatException 
} 

(mặc dù bạn bằng tay có thể thay thế ngoại lệ bởi NumberFormatException trong trường hợp này, nhưng nó chỉ là một ví dụ)

+1

Lưu ý, điều này sẽ không hoạt động đối với bất kỳ 'RuntimeException' nào. –

4

PMD xác định tất cả các những nơi bạn có các khối trống catch (PMD thực sự thực sự nhiều hơn). Nó có tích hợp NetBeans, vì vậy hãy thử.

Sau khi xác định tất cả các nơi có sản phẩm nào catch khối bạn sẽ phải cân nhắc từng từng mục riêng lẻ:

  • đôi khi chỉ cần đăng nhập thông điệp
  • đôi khi tái cấu trúc lân cận mã. I E. nếu bạn đang bắt một số NullPointerException, hãy thêm một kiểm tra null.
  • đôi khi bạn sẽ phải xem xét các trường hợp ngoại lệ rethrowing (và tuyên bố đã kiểm tra).