2012-11-07 21 views
26

Nếu tôi có ngoại lệ unhandled trong Java, Eclipse đề xuất hai lựa chọn cho tôi: (1) thêm ném tuyên bố và (2) bao quanh với try/catch.Thay đổi mã thoát được tự động tạo ngoại lệ trong Eclipse?

Nếu tôi chọn (2) nó sẽ thêm một mã

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Tôi muốn thay đổi điều này để

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    throw new RuntimeException(e); 
} 

Đây có phải là có thể?

CẬP NHẬT

Tại sao rất thích thay đổi người chủ đề ???

Nếu ngoại lệ bị bắt và in thì cũng không cần bắt nó nữa. Tôi thích ứng dụng của tôi bị lỗi nếu tôi quên xử lý ngoại lệ do nhầm lẫn. Vì vậy, tôi muốn làm lại nó theo mặc định.

+0

Chỉ cần chọn tùy chọn (1) nếu đó là những gì bạn muốn làm. –

+0

Lưu ý: đọc câu hỏi. Mục tiêu rõ ràng là chọn tùy chọn 2, nhưng với khối * mặc định * bắt mà không ẩn ngoại lệ, trong trường hợp trình mã hóa quên xử lý ngoại lệ. Điều này là hợp lý. Heck, tôi đang xem xét tự mình làm. –

+0

Cũ chủ đề .. nhưng bạn nên được tốt hơn off cập nhật các khối catch mặc định để một cái gì đó mà sẽ không biên dịch, mà sẽ 'buộc' bạn phải nhớ để xử lý các trường hợp ngoại lệ tại thời gian biên dịch. – crig

Trả lời

34

Có, bạn có thể thay đổi mã mặc định do Eclipse thêm vào.

  1. Trong tùy chọn, điều hướng đến Java> Kiểu mã> Mẫu mã.
  2. Dưới , chọn Nội dung khối catch.
  3. Nhấn nút Chỉnh sửa để thay đổi mã. Khi hoàn tất, nhấn nút OK.

Xem xét thêm nhận xét TODO vào khối catch mặc định.Ví dụ, mặc định bao gồm:

 // ${todo} Auto-generated catch block 
+8

Bạn không thể tin được! Bạn đã trả lời CÂU HỎI VÀ không có gì khác !!! –

+2

Và cảm ơn vì ý tưởng này. Tôi cũng đang sử dụng nó. –

0

Nếu bạn đang ném lại ngoại lệ của mình từ điều khoản bắt, thì bạn sẽ phải xử lý trong phương thức đã gọi phương thức hiện tại của bạn. Nhưng nếu bạn bao gồm ngoại lệ của mình trong RuntimeException, bạn sẽ không cần xử lý ngoại lệ. Nhưng tại sao bạn sẽ làm điều đó?

Ý tôi là tại sao không chỉ: -

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    throw e; 
} 

Bởi vì, trong mã của bạn, về cơ bản bạn đang quấn một có thể là checked exception trong một unchecked one. Nếu tôi giả định số MyUnhandledException của bạn là checked exception.

Và cũng lưu ý rằng, nếu bạn đang theo phương pháp này, bạn vẫn cần phải declare it để là thrown trong số throws clause của mình.

Nếu bạn chỉ muốn làm theo cách bạn đang làm, thì nó cũng sẽ hoạt động tốt. Bạn có thể thay đổi số Eclipse setting theo câu trả lời của @ Andy.

Tuy nhiên, tốt hơn là nên xem thiết kế của bạn. Tại sao phương pháp ghi đè ném một ngoại lệ không được khai báo trong phương thức overriden của bạn. Có lẽ có điều gì đó sai, cần được sửa chữa.

+0

Nếu tôi có thể ném 'MyUnhandledException' thì đó không phải là lỗi. Rõ ràng từ câu hỏi 'MyUnhandledException' không phải là thời gian chạy và không được mô tả trong khai báo phương thức - đây là trường hợp ngoại lệ duy nhất gây ra lỗi trình biên dịch. Vì vậy, tôi cần phải rethrow ngoại lệ trong wrapper thời gian chạy không thay đổi tuyên bố. Điều này có thể được yêu cầu nếu phương pháp được ghi đè. –

+0

@SuzanCioc. Vâng, trong trường hợp đó, nó sẽ hoạt động. Không có vấn đề gì trong đó. Nhưng vẫn còn tốt hơn là hãy xem phương pháp của bạn mà bạn đang ghi đè. Nếu phương thức ghi đè ném ngoại lệ không được khai báo trong phương thức 'overriden', thì chắc chắn có điều gì đó sai trái. –

+0

Không có ngoại lệ được kiểm tra trong C# ở tất cả và không có gì sai ở đó. Vì vậy, bất kỳ ngoại lệ có thể được chỉ gói vào 'RuntimeException' và nó sẽ không gây ra bất kỳ khó khăn bổ sung ngoại trừ ngoại lệ chính nó. –

1

Cá nhân, tôi sử dụng một thành ngữ chung chung không phụ thuộc vào loại ngoại lệ kiểm tra thực tế, bạn có thể làm cho Eclipse sử dụng như là một mẫu thay vì:

try { 
... 
} 
catch (RuntimeException e) { throw e; } 
catch (Exception e) { throw new RuntimeException(e); } 

Vấn đề là để bọc toàn bộ khối mã thay vì riêng từng dòng có thể ném một ngoại lệ. Khối có thể ném bất kỳ số lượng các trường hợp ngoại lệ được kiểm tra và bỏ chọn, và điều này sẽ cho phép các ngoại lệ không được kiểm soát đi qua không bị tổn hại và các ngoại lệ đã kiểm tra sẽ được bao bọc.

0

Bạn có thể nhận thức được điều này ... nhưng nếu bạn muốn loại bỏ tất cả sự lộn xộn và kích thích khỏi các ngoại lệ đã kiểm tra, tại sao không chỉ thêm throws Exception vào mọi phương thức?

Trong trường hợp của một phương pháp giao diện ghi đè loại này của mẫu sau đó có thể được sử dụng:

@Override 
public void close() throws IOException { 
    try { 
     _close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     throw new RuntimeException(e); 
    } 
} 

private void _close() throws Exception { 
    // ... closing ops 
}