PHP - 오류 처리
안녕하세요, PHP 개발자 지망생 여러분! 오늘은 PHP의 흥미로운 오류 처리 세계로 창natation합니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요; 저는 여러 개념을 단계별로 안내해드릴 것입니다. 수년 동안 수많은 학생들에게 가르쳐온 경험을 바탕으로 말이죠. 그럼 커피 한 잔을 마시며(또는 당신의 좋아하는 음료를 마시며), 시작해보겠습니다!
die() 함수
먼저 간단하지만 강력한 함수 die()
를 알아보겠습니다. 이 함수는 코드의 긴급 정지 버튼과 같습니다. PHP가 die()
를 만나면 즉시 실행을 중지하고 메시지를 출력합니다.
기본 예제를 보겠습니다:
<?php
$file = fopen("important_file.txt", "r");
if (!$file) {
die("아니야! 파일을 열 수 없습니다.");
}
echo "이 메시지를 본다면 파일이 성공적으로 열렸습니다!";
?>
이 코드에서 우리는 파일을 열려고 시도합니다. 실패하면 die()
가 모든 것을 중지하고 우리의 맞춤형 메시지를 표시합니다. PHP에게 "이 작업을 수행할 수 없다면 중지하고 알려줘!"라고 말하는 것과 같습니다.
오류 처리 함수
이제 맞춤형 오류 처리 함수로 우리의 오류 처리 게임을 한 단계 업그레이드해보겠습니다. 이는 자신만의 개인 보조를 오류 처리에 동원하는 것과 같습니다.
다음과 같이 만들 수 있습니다:
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>oops! 무언가 잘못되었습니다:</b><br>";
echo "오류: [$errno] $errstr<br>";
echo "오류가 발생한 줄 $errline in $errfile<br>";
}
set_error_handler("myErrorHandler");
// 오류를 유발해 보겠습니다
echo($undefined_variable);
?>
이 예제에서 우리는 myErrorHandler
라는 함수를 만들어 발생하는 모든 오류에 대한 자세한 정보를 제공합니다. 그런 다음 set_error_handler()
를 사용하여 PHP가 이 함수를 사용하도록 지정합니다. 정의되지 않은 변수를 echo하는 시도를 할 때, 우리의 맞춤형 오류 처리기가 작동하여 친절하고 정보가 풍부한 메시지를 제공합니다.
ArithmeticError 클래스
PHP 7에서는 여러 가지 새로운 오류 클래스를 도입했습니다. 그 중 하나는 ArithmeticError
입니다. 이 클래스는 수학 연산 중 오류가 발생할 때 던집니다.
다음과 같이 사용해보겠습니다:
<?php
$number = 1;
try {
$result = $number << -1;
} catch (ArithmeticError $e) {
echo "oops! 수학 오류가 발생했습니다: " . $e->getMessage();
}
?>
여기서 우리는 음수로의 비트 이동 연산을 시도하고 있습니다. 이는 허용되지 않습니다. PHP는 ArithmeticError
를捕獲하고 우리는 그것을 부드럽게 처리합니다.
DivisionByZeroError
수학 수업에서 선생님이 "0으로 나눌 수 없다!"고 말했던 기억이 나시나요? PHP도 그 기억을 가지고 있습니다! DivisionByZeroError
는 0으로 나누는 시도 시 던집니다.
다음과 같이 사용해보겠습니다:
<?php
function divide($numerator, $denominator) {
if ($denominator == 0) {
throw new DivisionByZeroError("와우 거기! 0으로 나눌 수 없어!");
}
return $numerator / $denominator;
}
try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "오류: " . $e->getMessage();
}
?>
이 예제에서 우리는 분모가 0인지 확인하는 divide
함수를 만들었습니다. 그렇다면 DivisionByZeroError
를 던져 맞춤형 메시지를 제공합니다.
ArgumentCountError
언제든지 누군가에게 전화를 걸었지만 말할 것을 까먹은 적이 있나요? ArgumentCountError
는 PHP가 "허, 중요한 것을 말해주지 않았어!"라고 말하는 방식입니다!
다음과 같이 사용해보겠습니다:
<?php
function greet($name) {
return "안녕하세요, $name!";
}
try {
echo greet(); // 이름을 제공하지 않았습니다!
} catch (ArgumentCountError $e) {
echo "오류: " . $e->getMessage();
}
?>
이 경우 우리는 greet
함수에 이름을 제공하지 않고 호출하고 있습니다. PHP는 ArgumentCountError
를 던져 우리는 그것을捕獲하고 처리합니다.
TypeError
TypeError
는 값이 기대하는 형식과 다를 때 던집니다. 피자를 주문했지만 햄버거를 가져온 것과 같습니다!
다음과 같이 사용해보겠습니다:
<?php
function addNumbers(int $a, int $b) {
return $a + $b;
}
try {
echo addNumbers("5", "10"); // 문자열을 전달하고 있습니다, 정수가 아닙니다!
} catch (TypeError $e) {
echo "oops! " . $e->getMessage();
}
?>
여기서 우리의 addNumbers
함수는 정수를 기대하지만, 우리는 문자열을 전달하고 있습니다. PHP는 형식 불일치를捕獲하고 TypeError
를 던집니다.
PHP에서 예외 처리
PHP의 예외는 서커스의 안전망과 같습니다. 그들은 오류가 큰 문제로 이어되기 전에 잡아줍니다. 예외를 어떻게 사용하는지 살펴보겠습니다:
<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("나이는 음수일 수 없습니다!");
}
if ($age < 18) {
throw new Exception("죄송합니다, 18세 이상이어야 합니다.");
}
return "환영합니다! 당신은 충분히 나이가 있습니다.";
}
try {
echo checkAge(15);
} catch (Exception $e) {
echo "오류: " . $e->getMessage();
} finally {
echo "<br>나이 확인기를 사용해주셔서 감사합니다!";
}
?>
이 예제에서 우리는 누군가가 입장할 수 있는지 확인하고 있습니다. 우리는 try
로 코드를 시도하고, catch
로 예외를 처리하며, finally
는 예외가 던져졌는지 여부와 관계없이 실행할 코드를 지정합니다.
맞춤형 예외 처리기 만들기
마지막으로, 우리는 자신만의 맞춤형 예외 처리기를 만들어보겠습니다. 이는 자신만의 오류 메시지 시스템을 설계하는 것과 같습니다!
<?php
class CustomException extends Exception {
public function errorMessage() {
$errorMsg = '오류가 발생했습니다: 줄 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b>은(는) 유효한 이메일 주소가 아닙니다';
return $errorMsg;
}
}
$email = "[email protected]";
try {
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new CustomException($email);
}
} catch (CustomException $e) {
echo $e->errorMessage();
}
?>
여기서 우리는 CustomException
클래스를 만들어 유효하지 않은 이메일 주소에 대한 자세한 오류 메시지를 제공합니다. 그런 다음 이 맞춤형 예외를 사용하여 이메일 주소를 확인합니다.
이렇게 해서 우리는 PHP의 다양한 오류 처리 기술을 다루었습니다. 좋은 오류 처리는 안전벨트와 같습니다 - 필요할 때까지는 불필요하다고 느껴질 수 있지만, 필요할 때는 필수적입니다. 이 개념들을 계속 연습하면 얼마 지나지 않아 오류를 처리하는 프로가 될 것입니다!
행복하게 코딩하세요, 그리고 기억하세요 - 프로그래밍에서 오류는 배우고 코드를 개선할 기회입니다!
Credits: Image by storyset