Pertanyaan Menangkap pengecualian umum di Jawa?


Kami menggunakan JUnit 3 di tempat kerja dan tidak ada ExpectedException anotasi. Saya ingin menambahkan utilitas ke kode kami untuk membungkus ini:

 try {
     someCode();
     fail("some error message");
 } catch (SomeSpecificExceptionType ex) {
 }

Jadi saya mencoba ini:

public static class ExpectedExceptionUtility {
  public static <T extends Exception> void checkForExpectedException(String message, ExpectedExceptionBlock<T> block) {
     try {
        block.exceptionThrowingCode();
        fail(message);
    } catch (T ex) {
    }
  }
}

Namun, Java tidak dapat menggunakan tipe pengecualian umum dalam blok tangkap, saya kira.

Bagaimana saya bisa melakukan hal seperti ini, bekerja di sekitar batasan Java?

Apakah ada cara untuk memeriksa bahwa ex variabel adalah tipe T?


32
2018-06-11 16:54


asal


Jawaban:


Anda bisa mengirimkan objek Kelas dan memeriksa itu secara programatis.

public static <T extends Exception> void checkForException(String message, 
        Class<T> exceptionType, ExpectedExceptionBlock<T> block) {
    try {
       block.exceptionThrowingCode();
   } catch (Exception ex) {
       if ( exceptionType.isInstance(ex) ) {
           return;
       } else {
          throw ex;  //optional?
       }
   }
   fail(message);
}

//...
checkForException("Expected an NPE", NullPointerException.class, //...

Saya tidak yakin apakah Anda ingin rethrow atau tidak; rethrowing sama-sama akan gagal / kesalahan dalam tes tetapi secara semantis saya tidak akan, karena pada dasarnya berarti "kami tidak mendapatkan pengecualian yang kami harapkan" dan sehingga mewakili kesalahan pemrograman, bukan kesalahan lingkungan uji.


27
2018-06-11 16:56



Saya memahami dorongan untuk mencoba menyederhanakan idiom pengecualian-tes Anda, tetapi serius: jangan. Setiap pilihan yang mungkin Anda dapatkan adalah penyembuhan yang lebih buruk daripada penyakitnya. Terutama Omong kosong @ExpectedException JUnit 4 ini! Ini adalah solusi kerangka kerja yang terlalu pintar, yang mengharuskan semua orang untuk mempelajari cara kerjanya, dibandingkan dengan kode Java biasa. Lebih buruk lagi, itu memberi Anda tidak ada cara untuk membungkus hanya bagian dari tes Anda yang Anda harapkan untuk membuang pengecualian, jadi jika langkah setup sebelumnya melempar pengecualian yang sama, tes Anda akan lulus meskipun kode Anda rusak.

Saya bisa menulis kecaman panjang tentang hal ini di sini (maaf karena tidak punya cukup waktu), karena kami sudah lama membahas masalah ini di antara para teknisi Java di Google, dan konsensusnya adalah tidak satu pun dari solusi gila ini. berharga. Biasakan untuk mencoba / menangkap, itu tidak seburuk itu.


5
2018-06-11 17:03



Generik bukan tipe. Mereka bukan template. Mereka mengkompilasi pemeriksaan jenis waktu, di Jawa. Blok pengecualian menangkap tipe. Anda dapat menangkap (Exception e) atau bahkan menangkap (Throwable e) dan kemudian melakukan cast sesuai kebutuhan.


1
2018-05-25 18:47



Nah, Anda hanya bisa menangkap Exception dan rethrow jika itu bukan Exception yang diharapkan. Meskipun praktik pengkodean yang baik biasanya menentukan bahwa jalur keberhasilan kode tidak boleh ditentukan oleh Pengecualian, jadi Anda mungkin ingin memikirkan ulang desain Anda.


0
2018-06-11 16:59



Anda juga dapat menggunakan IDE yang mendukung template langsung (seperti IntellJ IDEA contohnya ) dan menetapkan pintasan seperti ee -> [tab] yang memasukkan coba / tangkap / abaikan untuk Anda dan biarkan Anda mengetik yang benar.

seperti ini http://img80.imageshack.us/img80/433/capturadepantalla201006j.png

seperti ini http://img641.imageshack.us/img641/6733/capturadepantalla201006w.png


0
2018-06-11 17:31



Klausa tangkapan dengan parameter jenis tidak dimungkinkan:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCatch


0
2018-01-23 01:12