Pertanyaan Di PHP5, haruskah saya menggunakan Pengecualian atau trigger_error / set_error_handler? [Tutup]


Apa pro / kontra dalam melakukan keduanya. Apakah Ada Satu Cara Benar (tm)?


32
2017-09-13 15:18


asal


Jawaban:


Jika Anda ingin menggunakan pengecualian daripada kesalahan untuk seluruh aplikasi Anda, Anda dapat melakukannya dengan ErrorException dan pengendali kesalahan khusus (lihat halaman ErrorException untuk contoh handler kesalahan). Satu-satunya downside ke metode ini adalah bahwa kesalahan non-fatal masih akan membuang pengecualian, yang selalu fatal kecuali tertangkap. Pada dasarnya, bahkan sebuah E_NOTICE akan menghentikan seluruh aplikasi Anda jika Anda error_reporting pengaturan tidak menekannya.

Menurut pendapat saya, ada beberapa manfaat menggunakan ErrorException:

  1. Pengatur pengecualian khusus akan memungkinkan Anda menampilkan pesan yang bagus, bahkan untuk kesalahan, menggunakan set_exception_handler.
  2. Itu tidak mengganggu kode yang ada dengan cara apa pun ... trigger_error dan fungsi kesalahan lainnya akan tetap berfungsi normal.
  3. Itu membuat sangat sulit untuk mengabaikan kesalahan coding bodoh yang memicu E_NOTICEs dan E_WARNINGs.
  4. Kamu dapat memakai try/catch untuk membungkus kode yang dapat menghasilkan kesalahan PHP (bukan hanya pengecualian), yang merupakan cara yang bagus untuk menghindari penggunaan @ peretasan penindasan kesalahan:

    try {
        $foo = $_GET['foo'];
    } catch (ErrorException $e) {
        $foo = NULL;
    }
    
  5. Anda dapat membungkus seluruh skrip Anda dalam satu single try/catch blokir jika Anda ingin menampilkan pesan ramah kepada pengguna Anda ketika kesalahan yang tidak tertangkap terjadi. (Lakukan ini dengan hati-hati, karena hanya kesalahan dan pengecualian yang tidak tertangkap yang dicatat.)


20
2017-07-15 02:51



Anda harus menggunakan pengecualian dalam "Keadaan luar biasa", yaitu ketika Anda memanggil metode doFoo () Anda harus mengharapkannya untuk melakukan, jika karena beberapa alasan doFoo tidak dapat melakukan tugasnya maka itu harus menaikkan pengecualian.

Banyak kode php lama akan mengambil pendekatan mengembalikan false atau null ketika kegagalan telah terjadi, tetapi ini membuat hal-hal sulit untuk di-debug, pengecualian membuat debugging ini jauh lebih mudah.

Misalnya mengatakan Anda memiliki metode yang disebut getDogFood () yang mengembalikan array objek DogFood, jika Anda memanggil metode ini dan mengembalikan nol ketika ada yang salah bagaimana kode panggilan Anda dapat memberi tahu apakah null dikembalikan karena ada kesalahan atau hanya tidak ada makanan anjing yang tersedia?

Mengenai berurusan dengan pustaka kode lawas yang menggunakan pencatatan kesalahan inbuilt php, Anda dapat mengganti pencatatan kesalahan dengan fungsi set_error_handler (), yang dapat Anda gunakan untuk mengambil kembali Pengecualian umum.

Sekarang Anda memiliki semua kode Anda melemparkan pengecualian rinci, Anda bebas untuk memutuskan apa yang harus dilakukan dengan mereka, di beberapa bagian kode Anda, Anda mungkin ingin menangkap mereka dan mencoba metode alternatif atau Anda dapat login mereka menggunakan fungsi penebangan Anda sendiri yang mungkin masuk ke database, file, email - mana saja yang Anda inginkan. Singkatnya - Pengecualian lebih fleksibel.


8
2018-02-08 03:39



Saya menyukai gagasan menggunakan pengecualian, tetapi saya sering melibatkan perpustakaan pihak ketiga, dan kemudian jika mereka tidak menggunakan pengecualian, Anda akan mendapatkan 3-4 pendekatan berbeda untuk masalah ini! Zend menggunakan pengecualian. CakePHP menggunakan pengendali kesalahan khusus, dan sebagian besar perpustakaan PEAR menggunakan objek PEAR :: Error.

Saya yang ada adalah satu cara yang benar dalam hal ini. Rute penanganan kesalahan kustom mungkin yang paling fleksibel dalam situasi ini. Pengecualian adalah ide bagus meskipun jika Anda hanya menggunakan kode Anda sendiri, atau menggunakan pustaka yang menggunakannya.

Sayangnya di dunia PHP kita masih menderita penolakan untuk mati dari PHP4, jadi hal-hal seperti pengecualian, sementara mereka mungkin mewakili praktik terbaik sangat lambat untuk dipahami sementara semua orang masih menulis hal-hal untuk dapat bekerja di keduanya. dan 5. Semoga bencana ini sekarang berakhir, meskipun pada saat itu, kita akan memiliki ketegangan antara 6 dan 5 sebagai gantinya ...

/ Aku memegang kepala ...


6
2017-09-13 20:08



Itu tergantung pada situasinya. Saya cenderung menggunakan Pengecualian ketika saya menulis logika bisnis / aplikasi internal, dan trigger_error untuk Validator dan hal-hal semacam itu.

Pro untuk menggunakan Pengecualian pada tingkat logika adalah untuk memungkinkan aplikasi Anda untuk melakukan kesalahan seperti itu. Anda mengizinkan aplikasi untuk memilih alih-alih memiliki logika bisnis yang tahu cara menyajikan kesalahan.

Pro menggunakan trigger_error untuk Validator dan hal-hal yang bersifat alami, katakanlah,

try {
    $user->login();
}  catch (AuthenticationFailureException $e) {
    set_error_handler("my_login_form_handler");
    trigger_error("User could not be logged in. Please check username and password and try again!");
} catch (PersistenceException $pe) { // database unavailable
    set_error_handler("my_login_form_handler"); 
    trigger_error("Internal system error. Please contact the administrator.");
}

di mana my_login_form_handler mendongkrak string dan menempatkan elemen di area yang terlihat di atas formulir masuk.


3
2017-09-13 15:49



Tentunya, tidak ada "One Right Way", tetapi ada banyak pendapat tentang hal ini. ;)

Secara pribadi saya menggunakan trigger_error untuk hal-hal yang tidak dapat dilakukan pengecualian, yaitu pemberitahuan dan peringatan (yaitu hal-hal yang ingin Anda masuki, tetapi tidak menghentikan aliran aplikasi dengan cara yang sama seperti kesalahan / pengecualian dilakukan (bahkan jika Anda menangkapnya pada tingkat tertentu )).

Saya juga kebanyakan menggunakan pengecualian untuk kondisi yang dianggap tidak dapat dipulihkan (kepada pemanggil metode di mana pengecualian terjadi), yaitu kesalahan serius. Saya tidak menggunakan pengecualian sebagai alternatif untuk mengembalikan nilai dengan makna yang sama, jika itu mungkin dengan cara yang tidak berbelit-belit. Sebagai contoh, jika saya membuat metode pencarian, saya biasanya mengembalikan nilai nol jika tidak menemukan apa pun yang dicari daripada melempar EntityNotFoundException (atau yang setara).

Jadi aturan praktis saya adalah ini:

  • Selama tidak menemukan sesuatu adalah hasil yang masuk akal, saya merasa jauh lebih mudah mengembalikan dan memeriksa nilai-nilai null (atau beberapa nilai default lainnya) daripada menanganinya menggunakan klausa coba-tangkap.
  • Jika, di sisi lain, tidak menemukan itu adalah kesalahan serius yang tidak dalam ruang lingkup penelepon untuk pulih, saya masih membuang pengecualian.

Alasan untuk melemparkan pengecualian dalam kasus terakhir (sebagai lawan memicu kesalahan), adalah bahwa pengecualian jauh lebih ekspresif, mengingat bahwa Anda menggunakan subclass Exception yang bernama dengan benar. Saya menemukan bahwa menggunakan pengecualian Perpustakaan Standar PHP adalah titik awal yang baik ketika memutuskan pengecualian apa yang digunakan: http://www.php.net/~helly/php/ext/spl/classException.html

Anda mungkin ingin memperluasnya untuk mendapatkan pengecualian semantik yang lebih tepat untuk kasus khusus Anda.


3
2017-09-17 11:34



Intro

Dalam pengalaman pribadi saya, sebagai aturan umum, saya lebih suka menggunakan Pengecualian dalam kode saya, bukan trigger_error. Ini terutama karena menggunakan Pengecualian lebih fleksibel daripada memicu kesalahan. Dan, IMHO, ini juga bermanfaat tidak hanya untuk diri sendiri seperti untuk pengembang pihak ke-3.

  1. Saya dapat memperluas kelas Exception (atau menggunakan kode pengecualian) untuk secara eksplisit membedakan keadaan perpustakaan saya. Ini membantu saya dan pengembang pihak ke-3 dalam menangani dan debugging kode. Ini juga mengekspos di mana dan mengapa itu bisa gagal tanpa perlu browsing kode sumber.
  2. Saya dapat secara efektif menghentikan eksekusi Perpustakaan saya tanpa menghentikan eksekusi skrip.
  3. Pengembang pihak ke-3 dapat mengatur Pengecualian saya (dalam PHP> 5.3. *) Sangat berguna untuk debugging dan mungkin berguna dalam menangani situasi di mana perpustakaan saya dapat gagal karena alasan yang berbeda.

Dan saya bisa melakukan semua ini tanpa memaksakan bagaimana dia harus menangani kegagalan perpustakaan saya. (mis.: membuat fungsi penanganan kesalahan yang rumit). Dia dapat menggunakan blok tangkap percobaan atau hanya menggunakan pengendali pengecualian umum

catatan:


3
2017-12-01 02:12



Ide pengecualian elegan dan membuat proses penanganan kesalahan sangat halus. tetapi ini hanya berlaku ketika Anda memiliki kelas pengecualian yang tepat dan dalam pengembangan tim, satu hal yang lebih penting adalah pengecualian "standar". jadi jika Anda berencana untuk menggunakan pengecualian, sebaiknya Anda terlebih dahulu menstandarkan tipe pengecualian Anda, atau pilihan yang lebih baik adalah menggunakan pengecualian dari beberapa kerangka kerja populer. satu hal lain yang berlaku untuk PHP (di mana Anda dapat menulis objek kode orienter Anda dikombinasikan dengan kode struktural), adalah bahwa jika Anda menulis seluruh aplikasi Anda menggunakan kelas. Jika Anda menulis berorientasi objek, maka pengecualian lebih baik pasti. setelah semua saya pikir proses penanganan kesalahan Anda akan lebih halus dengan pengecualian dari trigger_error dan barang.


2
2017-09-16 19:39