Saya ingin cara yang lebih bersih untuk mendapatkan fungsi berikut untuk ditangkap dalam blok AError
和 BError
:
try { /* something */ } catch( AError, BError $e ) { handler1( $e ) } catch( Exception $e ) { handler2( $e ) }
Adakah ada cara untuk melakukan ini? Atau adakah saya perlu menangkap mereka secara individu?
AError
和 Berror
有一个共享基类,但它们也与我想落入 handler2
dikongsi oleh jenis lain, jadi saya tidak boleh menangkap kelas asas sahaja.
Ini mungkin dalam PHP >= 7.1. Lihat ini jawapan.
Jika anda boleh mengubah suai pengecualian, sila gunakan jawapan ini.
Kalau belum boleh cuba guna
Exception
捕获所有异常,然后使用instanceof
.Tetapi adalah lebih baik menggunakan berbilang blok tangkapan seperti yang dinyatakan dalam jawapan di atas .
Kemas kini:
Ciri ini tersedia bermula dari PHP 7.1.
Sintaksnya ialah:
Dokumentasi: https://www.php.net/manual/en/language.exceptions.php#example-334
RFC: https://wiki.php.net/rfc/multiple-catch
Komit: https://github.com/php/php-src/commit/ 0aed2cc2a440e7be17552cc669d71fdd24d1204a
Untuk versi sebelum PHP 7.1:
Walaupun jawapan yang lain ini katakan, anda boleh menangkap
AError
和BError
dalam blok yang sama (lebih mudah jika anda yang menentukan pengecualian). Walaupun terdapat pengecualian yang ingin anda "kecualikan", anda masih boleh menentukan hierarki untuk memenuhi keperluan anda.Kemudian:
Seperti yang anda boleh lihat di sinidan di sini, walaupun
SPL
pengecualian lalai mempunyai hierarki yang boleh dieksploitasi. Selain itu, seperti yang dinyatakan dalam Manual PHP:Maknanya anda juga boleh memilikinya
Anda perlu mengendalikannya secara berbeza daripada
AError
或BError
jadi kenyataan tangkapan anda akan kelihatan seperti ini:Jika anda mempunyai situasi di mana terdapat dua puluh atau lebih pengecualian yang secara sah tergolong dalam kelas super yang sama, dan anda perlu mengendalikan lima daripadanya (atau mana-mana kumpulan besar) sehala dan selebihnya dengan cara lain, anda masih boleh melakukannya.
Kemudian:
Menggunakan OOP apabila mengendalikan pengecualian adalah sangat berkuasa. Menggunakan perkara seperti
get_class
或instanceof
adalah penggodaman dan harus dielakkan jika boleh.Satu lagi penyelesaian yang saya ingin tambahkan ialah meletakkan fungsi pengendalian pengecualian ke dalam kaedahnya sendiri.
Anda boleh memilikinya
Dengan mengandaikan bahawa anda sama sekali tidak mempunyai cara untuk mengawal hierarki atau antara muka kelas pengecualian (dan hampir selalu akan ada cara), anda boleh melakukan perkara berikut:
Dengan cara ini, jika mekanisme pengendalian pengecualian anda perlu diubah, anda masih mempunyai satu lokasi kod yang perlu diubah suai dan anda bekerja dalam binaan umum OOP.