Saya perlu menangkap beberapa peringatan yang dilemparkan dari beberapa fungsi asli php dan kemudian menanganinya.
Secara khusus:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Itu melempar peringatan ketika permintaan DNS gagal.
try
Saya catch
tidak bekerja karena peringatan bukan pengecualian.
Saya sekarang memiliki 2 opsi:
set_error_handler
sepertinya berlebihan karena saya harus menggunakannya untuk menyaring setiap peringatan di halaman (apakah ini benar?);Sesuaikan pelaporan kesalahan / tampilan sehingga peringatan ini tidak disuarakan ke layar, lalu periksa nilai pengembalian; jika itu
false
, tidak ada catatan yang ditemukan untuk nama host.
Apa praktik terbaik di sini?
php
error-handling
try-catch
pengguna121196
sumber
sumber
Jawaban:
Setel dan pulihkan penangan kesalahan
Satu kemungkinan adalah untuk mengatur penangan kesalahan Anda sendiri sebelum panggilan dan mengembalikan penangan kesalahan sebelumnya dengan
restore_error_handler()
.Anda dapat membangun ide ini dan menulis penangan kesalahan yang dapat digunakan kembali yang mencatat kesalahan Anda.
Mengubah kesalahan menjadi pengecualian
Anda bisa menggunakan
set_error_handler()
danErrorException
kelas untuk mengubah semua kesalahan php menjadi pengecualian.Hal penting yang perlu diperhatikan ketika menggunakan penangan kesalahan Anda sendiri adalah bahwa ia akan melewati
error_reporting
pengaturan dan meneruskan semua kesalahan (pemberitahuan, peringatan, dll.) Ke penangan kesalahan Anda. Anda dapat mengaktifkan argumen keduaset_error_handler()
untuk menentukan jenis kesalahan yang ingin Anda terima, atau mengakses pengaturan saat ini menggunakan... = error_reporting()
di dalam penangan kesalahan.Menekan peringatan itu
Kemungkinan lain adalah untuk menekan panggilan dengan operator @ dan memeriksa nilai balik
dns_get_record()
sesudahnya. Tapi saya menyarankan hal ini karena kesalahan / peringatan dipicu untuk ditangani, bukan untuk ditekan.sumber
Solusi yang benar-benar berfungsi ternyata adalah pengaturan penangan kesalahan sederhana dengan
E_WARNING
parameter, seperti:sumber
callable
dapat digunakan di sini alih-alih string dengan deklarasi fungsitrow new \Exception($errstr, $errno);
di dalamwarning_handler
fungsi. Terima kasih.Berhati-hatilah dengan
@
operator - saat menekan peringatan, ia juga menekan kesalahan fatal. Saya menghabiskan banyak waktu men-debug masalah dalam sistem di mana seseorang telah menulis@mysql_query( '...' )
dan masalahnya adalah bahwa dukungan mysql tidak dimuat ke dalam PHP dan itu melemparkan kesalahan fatal yang sunyi. Ini akan aman untuk hal-hal yang merupakan bagian dari inti PHP tapi tolong gunakan dengan hati-hati.Tidak ada output lebih lanjut - semoga berhasil men-debug ini!
Kali ini kita bisa melihat mengapa itu gagal.
sumber
Saya ingin mencoba / menangkap peringatan, tetapi pada saat yang sama tetap menggunakan peringatan / kesalahan yang biasa dicatat (misalnya di
/var/log/apache2/error.log
); yang harus dikembalikan oleh pawangfalse
. Namun, karena pernyataan "throw new ..." pada dasarnya mengganggu eksekusi, kita harus melakukan trik "wrap in function", juga dibahas dalam:Apakah ada cara statis untuk melempar pengecualian di php
Atau, secara singkat:
Suntingan: setelah diperiksa lebih dekat, ternyata itu tidak bekerja: "
return false && throwErrorException ...
" pada dasarnya tidak akan membuang pengecualian, dan hanya login di log kesalahan; menghapus bagian "false &&
", seperti pada "return throwErrorException ...
", akan membuat perkecualian melempar bekerja, tetapi kemudian tidak akan masuk ke error_log ... Namun, saya tetap membiarkan ini diposting, karena saya belum melihat perilaku ini didokumentasikan di tempat lain.sumber
Anda mungkin harus mencoba untuk menghilangkan peringatan sepenuhnya, tetapi jika itu tidak mungkin, Anda dapat menambahkan panggilan dengan @ (yaitu @dns_get_record (...)) dan kemudian menggunakan informasi apa pun yang dapat Anda cari tahu jika peringatan itu terjadi atau tidak.
sumber
Anda seharusnya tidak pernah menggunakan @ kecuali jika ini adalah satu-satunya solusi. Dalam kasus khusus itu fungsi dns_check_record harus digunakan terlebih dahulu untuk mengetahui apakah catatan itu ada.
sumber
Menggabungkan baris kode ini di sekitar
file_get_contents()
panggilan ke url eksternal membantu saya menangani peringatan seperti " gagal membuka streaming: Koneksi habis waktu " jauh lebih baik:Solusi ini juga berfungsi dalam konteks objek. Anda bisa menggunakannya dalam suatu fungsi:
sumber
Jika
dns_get_record()
gagal, itu harus kembaliFALSE
, sehingga Anda dapat menekan peringatan dengan@
dan kemudian memeriksa nilai kembali.sumber
coba periksa apakah ia mengembalikan beberapa nilai boolean maka Anda cukup menempatkannya sebagai suatu syarat. Saya mengalami ini dengan oci_execute (...) yang mengembalikan beberapa pelanggaran dengan kunci unik saya.
sumber
Struktur Folder
CustomException.php
cukup sertakan file di atas ke dalam file skrip Anda seperti ini
index.php
sumber
Saya hanya akan merekomendasikan menggunakan @ untuk menekan peringatan ketika ini adalah operasi langsung (misalnya $ prop = @ ($ tinggi / ($ lebar - $ kedalaman)); untuk melewati pembagian dengan nol peringatan). Namun dalam kebanyakan kasus itu lebih baik ditangani.
sumber