Najlepszy samouczek obsługa wyjątków PHP W 2024 r. W tym samouczku możesz dowiedzieć się Co to jest nienormalne,Podstawowe zastosowanie wyjątku,Spróbuj, rzucać i łapać,Przykłady wyjaśnić:,Tworzenie niestandardowej klasy Exception,Przykłady wyjaśnić:,Wiele wyjątki,Przykłady wyjaśnić:,Rethrows,Przykłady wyjaśnić:,Najwyższego poziomu obsługi wyjątku zestaw,wyjątek,
Wyjątek na zmianę błąd skryptu pojawia się, gdy podano prawidłowy przepływ.
PHP 5 oferuje nową metodę obsługi błędów obiektowy.
Obsługa wyjątków jest używany, gdy określony błąd (wyjątek) występuje na zmianę normalnego przepływu skryptu. Stan ten nazywany jest wyjątek.
Gdy wyjątek zostanie uruchomiony, zazwyczaj następuje:
Pokażemy różne metody obsługi błędów:
Uwaga: Wyjątki powinny stosować tylko w przypadku wystąpienia błędu, nie należy stosować w określonym miejscu, aby przejść do następnego miejsca w kodzie.
Gdy jest wyjątek, późniejsze Kod nie dokonuje, PHP postara się znaleźć pasujący "złapać" blok.
Jeśli wyjątek nie zostanie złapany, ale żaden z wykorzystaniem set_exception_handler () dla odpowiedniej obróbce, to poważne błędu (błąd krytyczny) występuje, a wiadomości wyjście "Uncaught wyjątek" (przechwycony wyjątku) o błędach.
Spróbujmy wyjątek, ale nie złapać go:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
Powyższy kod będzie się błąd podobny do tego:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
Aby uniknąć błędów występujących w powyższym przykładzie, musimy stworzyć odpowiedni kod do obsługi wyjątków.
Prawidłowe obchodzenie się kod wyjątku powinien zawierać:
Niech wywołać wyjątek:
<?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(); } ?>
Powyższy kod pojawia się błąd jak poniżej:
Message: 变量值必须小于等于 1
Powyższy kod wygeneruje wyjątek i łapie go:
Jednakże, w celu śledzenia "każdy rzut musi odpowiadać catch" zasady, można założyć obsługi wyjątku najwyższego poziomu obsługi błędów nieodebranych.
Tworzenie niestandardowej procedury obsługi wyjątku jest bardzo prosta. Po prostu utworzyć specjalną klasę, gdy wystąpi wyjątek w PHP, możesz zadzwonić do jego funkcji. Klasa musi stanowić rozszerzenie klasy wyjątków.
Zwyczaj klasy wyjątku dziedziczy wszystkie atrybuty zdefiniowane w klasie wyjątku PHP, może chcesz dodać funkcje niestandardowe.
Zacznij od utworzenia klasy wyjątków:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@examplepl.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Ta nowa klasa jest kopią starej klasy wyjątków, plus funkcja errorMessage (). Ponieważ jest to kopia starej klasy, więc dziedziczy z dawnych właściwości i metod klasy, możemy użyć metody klasy wyjątków, takich jak getline (), getfile () i GetMessage ().
Powyższy kod wygeneruje wyjątek, a dzięki niestandardowej klasy wyjątków, aby ją zdobyć:
Można użyć wielu wyjątków jako skrypt do wykrywania różnych sytuacjach.
Można używać wielu blok ifplelse lub blok przełącznika kodu lub gniazdo wiele wyjątków. Wyjątki te mogą korzystać z różnych klas wyjątek i zwracają różne komunikaty o błędach:
<?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(); } ?>
Powyższy kod testuje dwa warunki, jeśli jeden warunek nie jest spełniony, to wyjątek:
Jeśli customException klasa jest wyjątek, ale nie złapany customException, zrobione tylko bazowej wyjątek, gdzie wyjątki uchwyt.
Czasem, gdy jest wyjątek, może chcesz różnią się od standardowego sposobu, by go obsłużyć. Może być ponownie rzucony w "złapać" bloku.
Skrypt powinien być ukryte przed błędami systemu użytkownika. Dla programistów, błędy systemowe mogą być ważne, ale użytkownik nie jest nimi zainteresowany. Aby ułatwić użytkownikom korzystanie można wyjątek dzięki względnie przyjazny użytkownikowi komunikat:
<?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(); } ?>
Powyższy kod jest wykrywany w adresie e-mail, jeśli zawiera ciąg "przykładowy". Jeśli tak, to znowu jest wyjątek:
Jeśli wyjątek nie zostanie złapany w aktualnym "try" bloku, wygląda na bloku catch na wyższym poziomie.
set_exception_handler function () może być ustawiony do obsługi wszystkich przechwycony wyjątek funkcji zdefiniowanych przez użytkownika.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
Wyjście kodu powyżej są następujące:
Exception: Uncaught Exception occurred
W powyższym kodzie, nie ma "złapać" bloku, ale obsługi wyjątku najwyższego poziomu wyzwolone. Funkcja ta powinna być wykorzystywane do przechwytywania wszystkich przechwycony wyjątek.
W skrócie: Jeśli wyjątek, trzeba go złapać.