Saya mencoba menjalankan Contoh # 1 ini dari halaman ini: http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
Namun, alih-alih keluaran yang diinginkan, saya mendapatkan:
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
Lingkungan pengembang yang saya gunakan adalah UniServer 3.5
denganPHP 5.2.3
Jawaban:
Saya baru saja mengalami masalah ini di mana sepertinya saya telah menyalin nama pengecualian, namun tidak menangkapnya. Ternyata itu adalah kesalahan bodoh saya, tetapi saya pikir saya harus memposting kasus saya di sini jika ada orang lain dalam situasi yang sama.
Aku punya pengecualian saya di namespace saya disebut A dan script itu dalam namespace disebut B . Masalahnya adalah saya memiliki A \ MyException yang sama dengan (dalam PHP) \ B \ A \ MyException (karena skrip saya ada di namespace bernama B !). Yang harus saya lakukan untuk memperbaikinya adalah menambahkan garis miring terbalik (atau apa pun namanya) ke nama pengecualian sehingga akan terlihat seperti ini: \ A \ MyException
sumber
catch (\Exception $e)
. Tanpa garis miring terbalikException
khusus untuk namespace dan tidak akan cocok (atau tertangkap).Pertanyaan yang cukup lama, namun ...
Saya mengalami masalah ini juga (dan begitulah cara saya menemukan posting ini) tetapi hanya eksperimen sederhana yang memungkinkan saya menemukan solusinya. Coba saja ubah
Exception
ke\Exception
. Bekerja untuk saya!EDIT:
Seperti yang ditunjukkan sivann di komentar, menggunakan namespace harus melakukan hal yang sama. Jadi, letakkan saja
use \Exception as Exception;
sebelum deklarasi kelas Anda.sumber
use Exception;
harus melakukannyaCobalah untuk menempatkan,
catch(\Exception $e)
bukancatch(Exception $e)
. Jika Anda menggunakan kode yang tidak Anda ketahui dengan baik, atau - terutama - jika Anda menggunakan kerangka kerja, itu mungkin menimpa Pengecualian PHP default dengan salah satunya, dan oleh karena itu Anda mungkin pergi ke jalur yang salah dan mendapatkan hasil yang tidak diinginkan. Jika Anda hanya memasukkan\Exception
, maka Anda yakin Anda menangkap pengecualian dasar PHP.sumber
Anda tidak bisa menggunakan blok try {} catch {} biasa dalam PHP seperti yang bisa Anda lakukan dalam bahasa lain seperti C # (Csharp).
Jika kamu melakukan ini:
Anda tidak akan melihat pesan 'Mengerti!' pesan tidak pernah. Mengapa? Itu hanya karena PHP selalu membutuhkan Pengecualian untuk "Dilempar". Anda perlu menyetel penangan kesalahan Anda sendiri dan melemparkan Pengecualian dengannya.
Lihat fungsi set_error_handler : http://php.net/manual/es/function.set-error-handler.php
sumber
$number = 5/0;
tidak memunculkan pengecualian.$number
diatur menjadiINF
.Awalnya saya adalah Anda memiliki kesalahan ketik dalam nama pengecualian yang Anda tangkap / lempar, tetapi jika kode Anda persis sama, saya tidak yakin persis apa yang sedang terjadi.
Coba modifikasi berikut dari skrip asli, dan tempelkan hasil Anda. Ini akan membantu mendiagnosis masalah Anda sedikit lebih baik.
sumber
Saya memiliki masalah yang sama dengan konfigurasi berikut,
PHP 5.2.14 (cli) (dibangun: Agustus 12 2010 17:32:30) Hak Cipta (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Hak Cipta (c) 1998-2010 Zend Technologies dengan eAccelerator v0.9.5. 1 , Hak Cipta (c) 2004-2006 eAccelerator, oleh eAccelerator
Solusinya adalah menonaktifkan eAccelerator atau memperbaruinya. Saya mencoba keduanya dan kedua perbaikan berhasil. Bug dilaporkan di sini https://eaccelerator.net/ticket/242 (NB. Firefox mengeluh tentang sertifikat SSL mereka).
Sekarang saya menjalankan coba tangkap dengan benar dengan konfigurasi berikut,
PHP 5.2.4 (cli) (dibangun: Okt 16 2007 09:13:35) Hak Cipta (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Hak Cipta (c) 1998-2007 Zend Technologies dengan eAccelerator v0.9.6. 1 , Hak Cipta (c) 2004-2010 eAccelerator, oleh eAccelerator
sumber
\ Pengecualian tidak berhasil untuk saya, tetapi saya menemukan solusi.
Saya perlu mengganti try {} catch (Exception $ e) {} dengan try {} catch (Throwable $ e) {}.
Untuk informasi lebih lanjut: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
sumber
di Xdebug ada pengaturan:
Ini akan memaksa php untuk mengeluarkan pengecualian bahkan dalam blok coba tangkap. Putar ini ke
0
sumber
Jika Anda menggunakan PHP 7, Anda mungkin perlu Throwable, bukan Exception
sumber
Mungkin mencoba menonaktifkan ekstensi pihak ketiga tertentu yang mungkin telah Anda instal? http://bugs.php.net/bug.php?id=41744
sumber
TLDR; pastikan Anda memiliki
use Exception;
di bagian atas kedua file phpsumber
Saya mengalami ini juga. Saya membaca komentar dari Rowinson Gallego yang menyatakan Exception harus dibuang. Jadi saya mengubah kode saya dari:
menjadi:
Berhasil.
sumber