Pengendalian pengecualian PHP

Pengecualian digunakan untuk mengubah aliran biasa skrip apabila ralat tertentu berlaku.

Apakah pengecualiannya

PHP 5 menyediakan kaedah pengendalian ralat berorientasikan objek baharu.

Pengendalian pengecualian digunakan untuk menukar aliran biasa skrip apabila situasi ralat (pengecualian) tertentu berlaku. Keadaan ini dipanggil pengecualian.

Apabila pengecualian dicetuskan, perkara yang biasanya berlaku ialah:

• Keadaan kod semasa disimpan

• Pelaksanaan kod ditukar kepada fungsi pengendali pengecualian (tersuai) yang dipratentukan

• Bergantung pada situasi, pemproses boleh memulakan semula pelaksanaan kod daripada keadaan kod yang disimpan, menamatkan pelaksanaan skrip atau meneruskan pelaksanaan skrip dari lokasi lain dalam kod

Kami akan menunjukkan pengendalian Ralat yang berbeza kaedah:

• Penggunaan asas pengecualian

• Buat pengendali pengecualian tersuai

• Pengecualian berbilang

• Lempar semula pengecualian

• Tetapkan Pengendali pengecualian peringkat atas

Nota: Pengecualian hanya boleh digunakan dalam situasi ralat dan tidak boleh digunakan untuk melompat ke lokasi lain dalam kod pada titik tertentu.

Penggunaan asas pengecualian

Apabila pengecualian dilemparkan, kod berikutnya tidak akan terus dilaksanakan dan PHP akan cuba mencari memadankan blok kod "tangkap".

Jika pengecualian tidak ditangkap dan tidak perlu menggunakan set_exception_handler() untuk pemprosesan yang sepadan, maka ralat serius (ralat maut) akan berlaku dan "Pengecualian Tidak Ditangkap" akan dikeluarkan.

Mari cuba melontar pengecualian tanpa menangkapnya:

<?php
 // 创建一个有异常处理的函数
  function checkNum($number)
  {
     if($number>1)
     {
        throw new Exception("Value must be 1 or below");
     }
       return true;
   }
 // 触发异常
   checkNum(2);
?>

Kod di atas akan mendapat ralat seperti ini:

Ralat maut: Pengecualian yang tidak ditangkap 'Pengecualian' dengan mesej 'Nilai mestilah 1 atau ke bawah'

dalam /www/php/test/test.php:7 Surih tindanan: #0 /www/php/test/test.php( 13): checkNum(2 ) #1 {utama} dilempar

dalam /www/php/test/test.php pada baris 7

Cuba, baling dan tangkap

Untuk mengelakkan ralat yang dilihat dalam contoh di atas, kita perlu mencipta kod yang sesuai untuk mengendalikan pengecualian.

Kod pengendalian pengecualian yang betul hendaklah termasuk:

1. Cuba - Fungsi yang menggunakan pengecualian hendaklah terletak dalam blok kod "cuba". Jika tiada pengecualian dicetuskan, kod meneruskan pelaksanaan seperti biasa. Tetapi jika pengecualian dicetuskan, pengecualian akan dilemparkan.

2. Lempar - menentukan cara mencetuskan pengecualian. Setiap "lontaran" mesti sepadan dengan sekurang-kurangnya satu "tangkapan".

3 Tangkap - Blok kod "tangkap" akan menangkap pengecualian dan mencipta objek yang mengandungi maklumat pengecualian.

Mari kita cetuskan pengecualian:

<?php
 // 创建一个有异常处理的函数
   function checkNum($number)
   {
     if($number>1)
     {
       throw new Exception("变量值必须小于等于 1");
     }
       return true;
   }
 // 在 try 块 触发异常
   try
   {
     checkNum(2);
   // 如果抛出异常,以下文本不会输出
     echo '如果输出该内容,说明 $number 变量';
   }
   // 捕获异常
     catch(Exception $e)
     {
      echo 'Message: ' .$e->getMessage();
     }
 ?>

Kod di atas akan mendapat ralat seperti ini:

Mesej: Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

Penjelasan contoh:

Kod di atas membuang pengecualian dan menangkapnya:

Buat fungsi checkNum(). Ia mengesan sama ada nombor itu lebih besar daripada 1. Jika ya, buang pengecualian.

Panggil fungsi checkNum() dalam blok kod "cuba".

Pengecualian dalam fungsi checkNum() dilemparkan.

Blok "tangkap" menerima pengecualian dan mencipta objek ($e) yang mengandungi maklumat pengecualian.

Keluarkan mesej ralat daripada pengecualian ini dengan memanggil $e->getMessage() daripada objek pengecualian ini.

Walau bagaimanapun, untuk mengikut prinsip "setiap lontaran mesti sepadan dengan tangkapan", anda boleh menyediakan pengendali pengecualian peringkat atas untuk mengendalikan ralat terlepas.

Buat kelas Pengecualian tersuai

Membuat pengendali pengecualian tersuai adalah sangat mudah. Kami hanya mencipta kelas khusus yang fungsinya dipanggil apabila pengecualian berlaku dalam PHP. Kelas ini mestilah lanjutan daripada kelas pengecualian.

Kelas pengecualian tersuai ini mewarisi semua sifat kelas pengecualian PHP dan anda boleh menambah fungsi tersuai padanya.

Kita mulakan dengan mencipta kelas pengecualian:

<?php
        class customException extends Exception
        {
            public function errorMessage()
            {
                // 错误信息
                $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
                .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
                return $errorMsg;
            }
        }
        $email = "someone@example...com";
        try
        {
            // 检测邮箱
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
            {
                // 如果是个不合法的邮箱地址,抛出异常
                throw new customException($email);
            }
        }
        catch (customException $e)
        {
        //display custom message
        echo $e->errorMessage();
        }
?>

Kelas baharu ini ialah salinan kelas pengecualian lama, ditambah dengan fungsi errorMessage(). Hanya kerana ia adalah salinan kelas lama, ia mewarisi sifat dan kaedah daripada kelas lama, dan kita boleh menggunakan kaedah kelas pengecualian, seperti getLine(), getFile(), dan getMessage().

Penjelasan contoh:

Kod di atas membuang pengecualian dan menangkapnya melalui kelas pengecualian tersuai:

Kelas customException(). telah dicipta sebagai lanjutan daripada kelas pengecualian lama. Dengan cara ini ia mewarisi semua sifat dan kaedah kelas pengecualian lama.

2. Cipta fungsi errorMessage(). Jika alamat e-mel tidak sah, fungsi ini mengembalikan mesej ralat.

3. Pembolehubah $e-mel ditetapkan kepada rentetan alamat e-mel yang tidak sah.

4. Jalankan blok kod "cuba" dan buang pengecualian kerana alamat e-mel tidak sah.

5. Blok kod "catch" menangkap pengecualian dan memaparkan mesej ralat.

Berbilang Pengecualian

Anda boleh menggunakan berbilang pengecualian untuk skrip untuk mengesan berbilang situasi.

Anda boleh menggunakan berbilang blok kod if..else, atau blok kod suis, atau sarang berbilang pengecualian. Pengecualian ini boleh menggunakan kelas pengecualian yang berbeza dan mengembalikan mesej ralat yang berbeza:

    <?php
        class customException extends Exception
        {
            public function errorMessage()
            {
                // 错误信息
                $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
                .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
                return $errorMsg;
            }
        }
        $email = "someone@example.com";
        try
        {
            // 检测邮箱
            if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
            {
                // 如果是个不合法的邮箱地址,抛出异常
                throw new customException($email);
            }
            // 检测 "example" 是否在邮箱地址中
            if(strpos($email, "example") !== FALSE)
            {
                throw new Exception("$email 是 example 邮箱");
            }
        }
        catch (customException $e)
        {
            echo $e->errorMessage();
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    ?>

Contoh penjelasan:

Kod di atas menguji dua syarat, jika mana-mana daripadanya Jika syarat adalah tidak benar, pengecualian dilemparkan:

1 Kelas customException() dicipta sebagai lanjutan daripada kelas pengecualian lama. Dengan cara ini ia mewarisi semua sifat dan kaedah kelas pengecualian lama.

2. Cipta fungsi errorMessage(). Jika alamat e-mel tidak sah, fungsi ini mengembalikan mesej ralat.

3 Tetapkan pembolehubah $e-mel kepada rentetan yang merupakan alamat e-mel yang sah tetapi mengandungi rentetan "contoh".

4. Jalankan blok kod "cuba" Dalam keadaan pertama, tiada pengecualian akan dilemparkan.

5 Memandangkan e-mel mengandungi rentetan "contoh", syarat kedua akan mencetuskan pengecualian.

6. Blok kod "tangkap" akan menangkap pengecualian dan memaparkan mesej ralat yang sesuai.

Jika kelas customException membuang pengecualian, tetapi tidak menangkap customException, tetapi hanya menangkap pengecualian asas, kendalikan pengecualian di sana.

Lempar semula pengecualian

Kadangkala, apabila pengecualian dilemparkan, anda mungkin mahu mengendalikannya secara berbeza daripada cara standard . Pengecualian boleh dilemparkan semula dalam blok "tangkapan".

Skrip harus menyembunyikan ralat sistem daripada pengguna. Ralat sistem mungkin penting kepada pengaturcara, tetapi pengguna tidak berminat dengannya. Untuk memudahkan pengguna, anda boleh membuang pengecualian sekali lagi dengan mesej yang lebih mesra pengguna:

    <?php
        class customException extends Exception
        {
            public function errorMessage()
            {
                // 错误信息
                $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';
                return $errorMsg;
            }
        }
        $email = "someone@example.com";
        try
        {
            try
            {
                // 检测 "example" 是否在邮箱地址中
                if(strpos($email, "example") !== FALSE)
                {
                    // 如果是个不合法的邮箱地址,抛出异常
                    throw new Exception($email);
                }
            }
            catch(Exception $e)
            {
                // 重新抛出异常
                throw new customException($email);
            }
        }
        catch (customException $e)
        {
            // 显示自定义信息
            echo $e->errorMessage();
        }
     ?>

Penjelasan contoh:

Kod di atas mengesan Sama ada alamat e-mel mengandungi rentetan "contoh". Jika ya, buang pengecualian sekali lagi:

1. Kelas customException() dicipta sebagai lanjutan daripada kelas pengecualian lama. Dengan cara ini ia mewarisi semua sifat dan kaedah kelas pengecualian lama.

2. Cipta fungsi errorMessage(). Jika alamat e-mel tidak sah, fungsi ini mengembalikan mesej ralat.

3 Tetapkan pembolehubah $e-mel kepada rentetan yang merupakan alamat e-mel yang sah tetapi mengandungi rentetan "contoh".

4. Blok "cuba" mengandungi blok "cuba" lain supaya pengecualian boleh dilemparkan semula.

5 Oleh kerana e-mel mengandungi rentetan "contoh", pengecualian dicetuskan.

6. Blok kod "catch" menangkap pengecualian dan melemparkan semula "customException".

7. Tangkap "customException" dan paparkan mesej ralat.

Jika pengecualian tidak ditangkap dalam blok "cuba" semasa, ia akan mencari blok tangkapan pada tahap yang lebih tinggi.

Tetapkan pengendali pengecualian peringkat atas

Fungsi set_exception_handler() boleh menetapkan fungsi yang ditentukan pengguna yang mengendalikan semua pengecualian yang tidak ditangkap.

      <?php
        function myException($exception)
        {
            echo "<b>Exception:</b> " , $exception->getMessage();
        }
        set_exception_handler('myException');
        throw new Exception('Uncaught Exception occurred');
      ?>

Keluaran kod di atas adalah seperti berikut:

Pengecualian: Pengecualian Tidak Ditangkap berlaku

Dalam kod di atas, tiada "tangkapan" " blok kod, sebaliknya mencetuskan pengendali pengecualian peringkat atas. Fungsi ini harus digunakan untuk menangkap semua pengecualian yang tidak ditangkap.

Peraturan pengecualian

1 Kod yang memerlukan pengendalian pengecualian hendaklah diletakkan dalam blok kod cuba untuk menangkap kemungkinan ralat .

2. Setiap blok kod cubaan atau lempar mesti mempunyai sekurang-kurangnya satu blok kod tangkapan yang sepadan.

3. Gunakan berbilang blok kod tangkapan untuk menangkap pelbagai jenis pengecualian.

4. Pengecualian boleh dilemparkan (dilempar semula) dalam blok tangkapan dalam blok percubaan.

Ringkasnya: jika pengecualian dilemparkan, anda mesti menangkapnya.


Meneruskan pembelajaran
||
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
  • Cadangan kursus
  • Muat turun perisian kursus