PHP: pengecualian vs kesalahan?

116

Mungkin saya melewatkannya di suatu tempat di manual PHP, tetapi apa sebenarnya perbedaan antara kesalahan dan pengecualian? Satu-satunya perbedaan yang dapat saya lihat adalah kesalahan dan pengecualian ditangani secara berbeda. Tetapi apa yang menyebabkan pengecualian dan apa yang menyebabkan kesalahan?

Jason Baker
sumber

Jawaban:

87

Pengecualian dilemparkan - mereka dimaksudkan untuk ditangkap. Kesalahan umumnya tidak dapat dipulihkan. Katakanlah misalnya - Anda memiliki blok kode yang akan memasukkan baris ke dalam database. Ada kemungkinan bahwa panggilan ini gagal (ID duplikat) - Anda akan mendapatkan "Error" yang dalam hal ini adalah "Exception". Saat Anda menyisipkan baris ini, Anda dapat melakukan sesuatu seperti ini

try {
  $row->insert();
  $inserted = true;
} catch (Exception $e) {
  echo "There was an error inserting the row - ".$e->getMessage();
  $inserted = false;
}

echo "Some more stuff";

Eksekusi program akan berlanjut - karena Anda 'menangkap' pengecualian. Pengecualian akan diperlakukan sebagai kesalahan kecuali itu tertangkap. Ini akan memungkinkan Anda untuk melanjutkan eksekusi program setelah gagal juga.

gnarf
sumber
29
Errors are generally unrecoverable<- sebenarnya, ini tidak benar. E_ERRORdan E_PARSEmerupakan dua kesalahan paling umum yang tidak dapat dipulihkan (ada beberapa kesalahan lainnya) tetapi sebagian besar kesalahan yang akan Anda lihat di dev dapat dipulihkan ( E_NOTICE, E_WARNINGet al). Sayangnya penanganan kesalahan PHP sangat berantakan - segala macam hal memicu kesalahan yang tidak perlu (sebagian besar fungsi sistem file, misalnya). Secara umum pengecualian adalah "cara OOP", tetapi sayangnya beberapa API OOP asli PHP menggunakan kesalahan alih-alih pengecualian :-(
DaveRandom
1
@DaveRandom E_NOTICE, E_WARNING bukanlah "kesalahan" menurut definisi kan? Saya selalu menganggapnya sebagai 'pesan' yang ditampilkan PHP untuk memberi tahu programmer bahwa ada sesuatu yang salah dengan kode yang dia tulis.
slhsen
2
@slhsen masalahnya benar-benar adalah terminologi yang buruk, semua bentuk pesan ini melalui "sistem penanganan kesalahan" di PHP, secara semantik semua peristiwa ini adalah "kesalahan", meskipun pemberitahuan / peringatan secara semantik jelas tidak sama dengan " error "dalam konteks itu. Untungnya PHP7 yang akan datang setidaknya telah membuka jalan untuk menyelesaikan kekacauan ini dengan mengubah sebagian besar dari hal-hal ini menjadi pengecualian yang dapat ditangkap (melalui Throwableantarmuka baru ), memberikan cara yang jauh lebih ekspresif dan absolut untuk membedakan dan menangani keduanya dengan benar. masalah dan pesan nasihat
DaveRandom
"Eksekusi program akan berlanjut" sudah berubah, ya? Karena PHP mengatakan "Ketika pengecualian dilempar, kode yang mengikuti pernyataan tidak akan dijalankan" ( php.net/manual/en/language.exceptions.php )
Robert Sinclair
1
Menurut saya yang dimaksud OP lebih tentang perbedaan antara keturunan ErrorVS keturunannya Exception.
XedinUnknown
55

Saya biasanya set_error_handlerke fungsi yang mengambil kesalahan dan melempar pengecualian sehingga apa pun yang terjadi, saya hanya akan memiliki pengecualian untuk ditangani. Tidak ada lagi @file_get_contentspercobaan / tangkap yang bagus dan rapi.

Dalam situasi debug saya juga memiliki penangan pengecualian yang mengeluarkan halaman seperti asp.net. Saya memposting ini di jalan tetapi jika diminta saya akan memposting sumber contoh nanti.

edit:

Selain seperti yang dijanjikan, saya telah memotong dan menempelkan beberapa kode saya bersama-sama untuk membuat sampel. Saya telah menyimpan di bawah ini ke file di workstation saya, Anda TIDAK LAGI dapat melihat hasilnya di sini (karena tautannya rusak).

<?php

define( 'DEBUG', true );

class ErrorOrWarningException extends Exception
{
    protected $_Context = null;
    public function getContext()
    {
        return $this->_Context;
    }
    public function setContext( $value )
    {
        $this->_Context = $value;
    }

    public function __construct( $code, $message, $file, $line, $context )
    {
        parent::__construct( $message, $code );

        $this->file = $file;
        $this->line = $line;
        $this->setContext( $context );
    }
}

/**
 * Inspire to write perfect code. everything is an exception, even minor warnings.
 **/
function error_to_exception( $code, $message, $file, $line, $context )
{
    throw new ErrorOrWarningException( $code, $message, $file, $line, $context );
}
set_error_handler( 'error_to_exception' );

function global_exception_handler( $ex )
{
    ob_start();
    dump_exception( $ex );
    $dump = ob_get_clean();
    // send email of dump to administrator?...

    // if we are in debug mode we are allowed to dump exceptions to the browser.
    if ( defined( 'DEBUG' ) && DEBUG == true )
    {
        echo $dump;
    }
    else // if we are in production we give our visitor a nice message without all the details.
    {
        echo file_get_contents( 'static/errors/fatalexception.html' );
    }
    exit;
}

function dump_exception( Exception $ex )
{
    $file = $ex->getFile();
    $line = $ex->getLine();

    if ( file_exists( $file ) )
    {
        $lines = file( $file );
    }

?><html>
    <head>
        <title><?= $ex->getMessage(); ?></title>
        <style type="text/css">
            body {
                width : 800px;
                margin : auto;
            }

            ul.code {
                border : inset 1px;
            }
            ul.code li {
                white-space: pre ;
                list-style-type : none;
                font-family : monospace;
            }
            ul.code li.line {
                color : red;
            }

            table.trace {
                width : 100%;
                border-collapse : collapse;
                border : solid 1px black;
            }
            table.thead tr {
                background : rgb(240,240,240);
            }
            table.trace tr.odd {
                background : white;
            }
            table.trace tr.even {
                background : rgb(250,250,250);
            }
            table.trace td {
                padding : 2px 4px 2px 4px;
            }
        </style>
    </head>
    <body>
        <h1>Uncaught <?= get_class( $ex ); ?></h1>
        <h2><?= $ex->getMessage(); ?></h2>
        <p>
            An uncaught <?= get_class( $ex ); ?> was thrown on line <?= $line; ?> of file <?= basename( $file ); ?> that prevented further execution of this request.
        </p>
        <h2>Where it happened:</h2>
        <? if ( isset($lines) ) : ?>
        <code><?= $file; ?></code>
        <ul class="code">
            <? for( $i = $line - 3; $i < $line + 3; $i ++ ) : ?>
                <? if ( $i > 0 && $i < count( $lines ) ) : ?>
                    <? if ( $i == $line-1 ) : ?>
                        <li class="line"><?= str_replace( "\n", "", $lines[$i] ); ?></li>
                    <? else : ?>
                        <li><?= str_replace( "\n", "", $lines[$i] ); ?></li>
                    <? endif; ?>
                <? endif; ?>
            <? endfor; ?>
        </ul>
        <? endif; ?>

        <? if ( is_array( $ex->getTrace() ) ) : ?>
        <h2>Stack trace:</h2>
            <table class="trace">
                <thead>
                    <tr>
                        <td>File</td>
                        <td>Line</td>
                        <td>Class</td>
                        <td>Function</td>
                        <td>Arguments</td>
                    </tr>
                </thead>
                <tbody>
                <? foreach ( $ex->getTrace() as $i => $trace ) : ?>
                    <tr class="<?= $i % 2 == 0 ? 'even' : 'odd'; ?>">
                        <td><?= isset($trace[ 'file' ]) ? basename($trace[ 'file' ]) : ''; ?></td>
                        <td><?= isset($trace[ 'line' ]) ? $trace[ 'line' ] : ''; ?></td>
                        <td><?= isset($trace[ 'class' ]) ? $trace[ 'class' ] : ''; ?></td>
                        <td><?= isset($trace[ 'function' ]) ? $trace[ 'function' ] : ''; ?></td>
                        <td>
                            <? if( isset($trace[ 'args' ]) ) : ?>
                                <? foreach ( $trace[ 'args' ] as $i => $arg ) : ?>
                                    <span title="<?= var_export( $arg, true ); ?>"><?= gettype( $arg ); ?></span>
                                    <?= $i < count( $trace['args'] ) -1 ? ',' : ''; ?> 
                                <? endforeach; ?>
                            <? else : ?>
                            NULL
                            <? endif; ?>
                        </td>
                    </tr>
                <? endforeach;?>
                </tbody>
            </table>
        <? else : ?>
            <pre><?= $ex->getTraceAsString(); ?></pre>
        <? endif; ?>
    </body>
</html><? // back in php
}
set_exception_handler( 'global_exception_handler' );

class X
{
    function __construct()
    {
        trigger_error( 'Whoops!', E_USER_NOTICE );      
    }
}

$x = new X();

throw new Exception( 'Execution will never get here' );

?>
Keris
sumber
Itu akan sangat membantu. Apa pun untuk meringankan waktu saya berurusan dengan PHP akan membantu. :-)
Jason Baker
Kode yang bagus, terima kasih. Saya tidak mengerti dari mana asal kelas X, dan apa tujuannya?
Alec
semua yang ada di bawah "set_exception_handler ('global_exception_handler');" hanyalah demo, Anda tidak memerlukannya, ini hanya untuk menunjukkan apa yang akan terjadi dalam situasi kesalahan yang biasanya bukan pengecualian.
Kris
Standar PHP mendefinisikan ErrorException secara khusus untuk dibuang dari penangan kesalahan umum. Apakah Anda mengizinkan saya untuk mengedit dan memperbarui posting Anda?
Tiberiu-Ionuț Stan
@ Tiberiu-IonuțStan: tentu, tetapi contoh kerja tidak akan sinkron. Juga, saat ini saya mungkin akan mengarahkan orang ke github.com/theredhead/red.web/blob/master/src/lib/bootstrap.php dari private-void.com sebagai gantinya.
Kris
21

Jawabannya pantas untuk membicarakan gajah di dalam ruangan

Error adalah cara lama menangani kondisi error pada saat run-time. Biasanya kode akan membuat panggilan ke sesuatu seperti set_error_handlersebelum menjalankan beberapa kode. Mengikuti tradisi interupsi bahasa assembly. Berikut adalah tampilan beberapa kode BASIC.

on error :divide_error

print 1/0
print "this won't print"

:divide_error

if errcode = X
   print "divide by zero error"

Sulit untuk memastikan bahwa set_error_handleritu akan disebut dengan nilai yang tepat. Dan lebih buruk lagi, panggilan dapat dilakukan ke prosedur terpisah yang akan mengubah penanganan kesalahan. Ditambah berkali-kali panggilan diselingi dengan set_error_handlerpanggilan dan penangan. Mudah bagi kode untuk segera lepas kendali. Penanganan pengecualian datang untuk menyelamatkan dengan memformalkan sintaksis dan semantik dari apa yang sebenarnya dilakukan kode bagus.

try {
   print 1/0;
   print "this won't print";
} catch (DivideByZeroException $e) {
   print "divide by zero error";
}

Tidak ada fungsi terpisah atau risiko memanggil penangan kesalahan yang salah. Kode sekarang dijamin berada di tempat yang sama. Ditambah kami mendapatkan pesan kesalahan yang lebih baik.

PHP dulunya hanya memiliki penanganan kesalahan, ketika banyak bahasa lain telah berevolusi ke model penanganan pengecualian yang lebih disukai. Akhirnya pembuat PHP menerapkan penanganan pengecualian. Tetapi cenderung mendukung kode lama, mereka tetap menangani kesalahan dan menyediakan cara untuk membuat penanganan kesalahan terlihat seperti penanganan pengecualian. Kecuali itu, tidak ada jaminan bahwa beberapa kode mungkin tidak mengatur ulang penangan kesalahan yang persis seperti yang dimaksudkan oleh penanganan pengecualian.

Jawaban akhir

Kesalahan yang dikodekan sebelum penanganan pengecualian diterapkan, kemungkinan masih merupakan kesalahan. Kesalahan baru kemungkinan merupakan pengecualian. Tetapi tidak ada desain atau logika yang merupakan kesalahan dan yang merupakan pengecualian. Itu hanya berdasarkan pada apa yang tersedia pada saat itu dikodekan, dan preferensi pemrogram yang mengkodekannya.

Arturo Hernandez
sumber
3
Inilah alasan sebenarnya mengapa pengecualian dan kesalahan hidup berdampingan. Jika dirancang dari awal, php hanya boleh menyertakan satu atau yang lain.
Tomas Zubiri
1
Itu jawaban terbaik menurut saya, karena paling detail dan jelas.
Robert Kusznier
8

Satu hal yang perlu ditambahkan di sini adalah tentang menangani pengecualian dan kesalahan. Untuk tujuan pengembang aplikasi, baik kesalahan maupun pengecualian adalah "hal buruk" yang ingin Anda catat untuk mempelajari masalah yang dimiliki aplikasi Anda - sehingga pelanggan Anda memiliki pengalaman yang lebih baik dalam jangka panjang.

Jadi masuk akal untuk menulis penangan kesalahan yang melakukan hal yang sama seperti yang Anda lakukan untuk pengecualian.

Alex Weinstein
sumber
Terima kasih telah memberikan tautannya!
Mike Moore
@Alex Weinstein: tautannya rusak
Marco Demaio
7

Seperti yang dinyatakan dalam jawaban lain, mengatur penangan kesalahan ke pelempar pengecualian adalah cara terbaik untuk menangani kesalahan di PHP. Saya menggunakan penyiapan yang sedikit lebih sederhana:

set_error_handler(function ($errno, $errstr, $errfile, $errline ) {
        if (error_reporting()) {
                throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
        }
});

Harap perhatikan error_reporting()cek yang harus disimpan@ operator bekerja. Juga, tidak perlu mendefinisikan pengecualian khusus, PHP memiliki satu kelas yang bagus untuk itu.

Manfaat besar dari melempar pengecualian adalah bahwa pengecualian memiliki pelacakan tumpukan yang terkait dengannya, sehingga mudah untuk menemukan di mana masalahnya.

Josef Kufner
sumber
5

Re: "tapi apa sebenarnya perbedaan antara kesalahan dan pengecualian?"

Ada banyak jawaban bagus tentang perbedaan di sini. Saya hanya akan menambahkan sesuatu yang belum dibicarakan - kinerja. Secara khusus, ini untuk perbedaan antara melempar / menangani pengecualian dan menangani kode yang dikembalikan (berhasil atau beberapa kesalahan). Biasanya, di php artinya mengembalikan falseatau null, tetapi bisa lebih detail seperti mengupload file: http://php.net/manual/en/features.file-upload.errors.php Anda bahkan dapat mengembalikan objek Exception !

Saya telah melakukan beberapa kinerja yang berjalan dalam berbagai bahasa / sistem. Secara umum, penanganan pengecualian sekitar 10.000x lebih lambat daripada memeriksa kode pengembalian kesalahan.

Jadi, jika benar-benar, secara positif perlu menyelesaikan eksekusi bahkan sebelum dimulai - Anda kurang beruntung karena perjalanan waktu tidak ada. Tanpa perjalanan waktu, kode pengembalian adalah opsi tercepat yang tersedia.

Edit:

PHP sangat dioptimalkan untuk penanganan pengecualian. Tes dunia nyata menunjukkan bahwa melempar pengecualian hanya 2-10x lebih lambat daripada mengembalikan nilai.

evan
sumber
3
Tentu, tetapi jumlah siklus yang hilang untuk melempar Pengecualian lebih dari yang dibuat oleh kekuatan deskriptif ekstra yang Anda dapatkan dengan Pengecualian. Anda dapat menampilkan jenis pengecualian tertentu, bahkan menambahkan data ke pengecualian untuk memuat kode kesalahan. Saya juga sangat meragukan klaim 10.000 * Anda. Bahkan jika Anda benar tentang perbedaan waktu, waktu yang dihabiskan untuk melakukan pengembalian & jika vs. baru Eksekusi, lempar, tangkap dalam skenario dunia nyata apa pun kemungkinannya sangat kecil dibandingkan dengan kode yang dieksekusi sehingga ini jelas merupakan pengoptimalan prematur. Lempar pengecualian, mereka lebih baik menangani 90% waktu.
gnarf
1
1. 10.000x akurat - dengan beberapa varian berdasarkan pilihan bahasa dan kompiler. 2. Anda tidak perlu mengembalikan null / false. Anda dapat mengembalikan angka - hingga MAX_ULONG kode pengembalian di sana. Sebagai alternatif, Anda dapat mengembalikan string yang gagal dan hanya memeriksa string sukses atau int atau null. 3. Dalam skenario dunia nyata, setiap siklus jam dihitung. Facebook memiliki 552 juta pengguna aktif harian. Dengan asumsi pengecualian hanya 2x dan bahwa memeriksa pengguna / sandi memerlukan waktu 0,001 detik, itu berarti menghemat waktu pemrosesan 153 jam setiap hari. Pada 10.000x, ini menghemat 175 tahun. Hanya untuk memeriksa upaya login - setiap hari.
evan
@evan: FYI, di sini mereka menguji kode dengan pengecualian dan tampaknya tidak lebih lambat: stackoverflow.com/a/445094/260080
Marco Demaio
@MarcoDemaio Pertanyaan itu hanya mencakup blok coba / tangkap tanpa memberikan pengecualian. Pengujian yang lebih baik adalah mengembalikan nilai dalam noexcept () dan melempar pengecualian ke kecuali (). Juga, itu harus meluap melalui beberapa fungsi. stackoverflow.com/a/104375/505172 menyatakan bahwa perbedaan dalam PHP sebenarnya 54x. Saya menjalankan pengujian saya sendiri dengan melihat waktu nyata dan tampaknya menjadi 2-10x lebih lambat. Ini jauh lebih baik dari yang diharapkan.
evan
@evan: Saya tidak akan khawatir, saya menggunakan pengecualian hanya untuk melacak kesalahan yang tidak terduga / tidak dapat dipulihkan sehingga meskipun 100 kali lebih lambat saya tidak akan peduli. Kekhawatiran saya adalah membuat kode lebih lambat hanya dengan menambahkan blok coba / tangkap.
Marco Demaio
4

Saya pikir jawaban yang Anda cari adalah itu;

Kesalahan adalah hal standar yang biasa Anda lakukan, seperti menggemakan $ variabel yang tidak ada.
Pengecualian hanya dari PHP 5 dan seterusnya dan datang saat berurusan dengan objek.

Sederhananya:

Pengecualian adalah kesalahan yang Anda dapatkan saat menangani objek. Pernyataan coba / tangkap memungkinkan Anda melakukan sesuatu tentang mereka, dan digunakan seperti pernyataan if / else. Coba lakukan ini, jika masalah, tidak masalah, lakukan ini.

Jika Anda tidak "menangkap" pengecualian, maka itu berubah menjadi kesalahan standar.

Kesalahan adalah kesalahan fundemental php yang biasanya menghentikan skrip Anda.

Coba / tangkap sering digunakan untuk membuat koneksi database seperti PDO, yang tidak masalah jika Anda ingin mengarahkan skrip atau melakukan sesuatu yang lain jika koneksi tidak berfungsi. Tetapi jika Anda hanya ingin menampilkan pesan kesalahan dan menghentikan skrip maka Anda tidak membutuhkannya, pengecualian yang tidak tertangkap berubah menjadi kesalahan yang fatal. Atau Anda juga dapat menggunakan pengaturan penanganan kesalahan di seluruh situs.

Semoga membantu

Lan
sumber
3
Pengecualian juga dapat digunakan dengan kode prosedural di PHP.
Tiberiu-Ionuț Stan
2

Di PHP 7.1 dan yang lebih baru, blok penangkap dapat menentukan beberapa pengecualian menggunakan karakter pipa (|). Ini berguna ketika pengecualian yang berbeda dari hierarki kelas yang berbeda ditangani dengan cara yang sama.

try {
  // do something
} catch (Error | Exception $e) {
  echo $e->getMessage();
}
Jehong Ahn
sumber
1

Pengecualian diberikan dengan sengaja oleh kode yang menggunakan lemparan, kesalahan ... tidak terlalu banyak.

Kesalahan muncul sebagai akibat dari sesuatu yang biasanya tidak ditangani. (Kesalahan IO, kesalahan TCP / IP, kesalahan referensi nol)

cgp
sumber
1
Ini belum tentu benar. Dalam banyak kasus kesalahan diperiksa dan kode pengembalian sengaja dikirim kembali sebagaimana mestinya. Faktanya, itu adalah kasus untuk setiap bahasa yang tidak berorientasi objek. Pengecualian hanya itu, juga, pengecualian untuk aturan tersebut. Dalam kedua kasus, ada yang tidak beres, diperhatikan, dan harus ditangani. Pengunggahan
evan
1

Saya bermaksud memberi Anda diskusi yang paling tidak biasa tentang pengendalian kesalahan.

Saya membangun penangan kesalahan yang sangat baik ke dalam bahasa bertahun-tahun yang lalu, dan meskipun beberapa nama telah berubah, prinsip pemrosesan kesalahan tetap sama saat ini. Saya memiliki OS multi-tasking yang dibuat khusus dan harus dapat memulihkan dari kesalahan data di semua level tanpa kebocoran memori, pertumbuhan tumpukan, atau crash. Jadi, berikut ini adalah pemahaman saya tentang bagaimana kesalahan dan pengecualian harus beroperasi dan bagaimana perbedaannya. Saya hanya akan mengatakan saya tidak memiliki pemahaman tentang bagaimana internal mencoba menangkap bekerja, jadi saya menebak-nebak.

Hal pertama yang terjadi di balik penutup untuk pemrosesan kesalahan adalah melompat dari satu status program ke status program lainnya. Bagaimana caranya? Saya akan membahasnya.

Secara historis, kesalahan lebih lama dan lebih sederhana, dan pengecualian lebih baru dan sedikit lebih kompleks serta mampu. Kesalahan berfungsi dengan baik sampai Anda perlu melampiaskannya, yang setara dengan menyerahkan masalah sulit kepada supervisor Anda.

Kesalahan bisa berupa angka, seperti nomor kesalahan, dan terkadang dengan satu atau beberapa string terkait. Misalnya jika terjadi kesalahan membaca file, Anda mungkin dapat melaporkannya dan mungkin gagal dengan baik. (Hay, ini adalah langkah maju dari sekadar menabrak seperti di masa lalu.)

Apa yang tidak sering dikatakan tentang pengecualian adalah bahwa pengecualian adalah objek yang dilapisi pada tumpukan pengecualian khusus. Ini seperti tumpukan kembali untuk aliran program, tetapi memegang status kembali hanya untuk percobaan dan tangkapan kesalahan. (Saya biasa menyebutnya ePush dan ePop, dan? Abort adalah lemparan bersyarat yang akan melakukan ePop dan memulihkan ke level itu, sedangkan Abort adalah mati atau keluar penuh.)

Di bagian bawah tumpukan adalah informasi tentang pemanggil awal, objek yang mengetahui tentang status saat percobaan luar dimulai, yang sering kali saat program Anda dimulai. Di atas itu, atau lapisan berikutnya pada tumpukan, dengan up menjadi anak-anak, dan di bawah menjadi orang tua, adalah objek pengecualian dari blok coba / tangkap dalam berikutnya.

Jika Anda mencoba dalam percobaan, Anda menumpuk percobaan dalam di atas percobaan luar. Ketika kesalahan terjadi dalam percobaan dalam dan baik tangkapan dalam tidak dapat menanganinya atau kesalahan dilemparkan ke percobaan luar, maka kontrol dilewatkan ke blok tangkapan luar (objek) untuk melihat apakah itu dapat menangani kesalahan, yaitu supervisor Anda.

Jadi apa yang sebenarnya dilakukan tumpukan kesalahan ini adalah untuk dapat menandai dan memulihkan aliran program dan status sistem, dengan kata lain, ini memungkinkan program untuk tidak merusak tumpukan yang kembali dan mengacaukan hal-hal untuk orang lain (data) ketika ada yang salah. Jadi itu juga menyimpan status sumber daya lain seperti kumpulan alokasi memori dan sehingga dapat membersihkannya ketika penangkapan selesai. Secara umum ini bisa menjadi hal yang sangat rumit, dan itulah sebabnya penanganan pengecualian seringkali lambat. Secara umum cukup banyak status yang perlu masuk ke blok pengecualian ini.

Jadi, semacam blok coba / tangkap menetapkan keadaan untuk dapat kembali jika semuanya menjadi kacau. Ini seperti orang tua. Ketika hidup kita kacau balau, kita bisa kembali ke pangkuan orang tua kita dan mereka akan baik-baik saja.

Kuharap aku tidak mengecewakanmu.

Tampilan elips
sumber
1

Anda dapat menambahkan komentar ini

function doSomething()
{
   /** @noinspection PhpUnhandledExceptionInspection */
   throw new Exception();
}
Yolo
sumber
0

Setelah set_error_handler () didefinisikan, penanganan error mirip dengan Exception. Lihat kode di bawah ini:

 <?php
 function handleErrors( $e_code ) {
   echo "error code: " . $e_code . "<br>";
 }

 set_error_handler( "handleErrors" ); 

 trigger_error( "trigger a fatal error", E_USER_ERROR);
 echo "after error."; //it would run if set_error_handler is defined, otherwise, it wouldn't show
?>
N Zhang
sumber