PHP Try...Catch: 초보자를 위한 에러 처리 가이드

안녕하세요, 미래의 PHP 마에스트로 여러분! 오늘 우리는 PHP의 에러 처리 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 적어본 적 없으신분도 걱정 마세요 - 이 모험을 통해 여러분의 친절한 안내자가 되어드리겠습니다. 마침내, 프로처럼 에러를 잡을 수 있을 것입니다!

PHP - Try…Catch

Try, Throw, Catch, Finally: 에러 처리의 네 명의 기사

먼저 기본적인 내용부터 시작해보겠습니다. PHP에서 우리는 에러 처리 드라마의 네 명의 주요 인물을 가지고 있습니다:

  1. Try
  2. Throw
  3. Catch
  4. Finally

이들을 슈퍼 헴어팀으로 생각해보세요. 각자 특별한 능력을 가지고 있어 우리가 부드럽게 에러를 처리할 수 있도록 도와줍니다. 이들을 만나보겠습니다!

"Try" 블록: 용감한 탐험가

"try" 블록은 호기심 많은 탐험가처럼, 잠재적으로 위험한 지역으로 진입합니다. 이곳에는 에러를 발생시킬 수 있는 코드가 들어 있습니다. 다음과 같이 보입니다:

try {
// 잠재적으로 위험한 코드가 여기 들어갑니다
$result = 10 / 0; // 아이고, 0으로 나누는 건 수학적으로 안 됩니다!
}

이 예제에서 우리는 10을 0으로 나누려고 시도하고 있습니다. 이는 수학적으로 금지된 일입니다. 하지만 프로그램이崩溃하는 대신, 이 에러를 부드럽게 처리할 기회를 주고 있습니다.

"Throw" 키워드: 경고를 울리다

"try" 블록에서 무언가 잘못되면 "throw" 키워드를 사용하여 경고를 울릴 수 있습니다. 이는 위험에 처했을 때 "도와줘!"라고 외치는 것과 같습니다. 다음과 같이 사용합니다:

try {
$age = -5;
if ($age < 0) {
throw new Exception("나이는 음수일 수 없습니다!");
}
}

이 경우, 누군가 음수 나이를 설정하려고 시도할 때, 우리는 사용자 정의 에러 메시지와 함께 예외를 던집니다.

"Catch" 블록: 에러를 잡는 안전망

"catch" 블록은 "try" 블록에서 던진 예외를 잡는 안전망입니다. 이곳에서 우리는 에러를 어떻게 처리할지 결정합니다. 다음은 예제입니다:

try {
$result = 10 / 0;
} catch (Exception $e) {
echo "오예! 에러가 발생했습니다: " . $e->getMessage();
}

"try" 블록에서 에러가 발생하면, "catch" 블록이 즉시 작동하여 사용자 정의 에러 메시지를 표시합니다.

"Finally" 블록: 정리하는 크루

"finally" 블록은 "try"와 "catch" 블록이 무엇이든 발생했는지 상관없이 실행되는 정리 크루입니다. 다음과 같이 보입니다:

try {
$file = fopen("important_file.txt", "r");
// 파일 연산 일부
} catch (Exception $e) {
echo "에러: " . $e->getMessage();
} finally {
fclose($file); // 에러가 발생했든 안 했든 파일을 항상 닫습니다
}

이 예제에서 우리는 파일을 열고, 무엇이든 발생했는지 상관없이 파일을 닫도록 합니다.

Exception 클래스: 에러의 블루프린트

PHP의 Exception 클래스는 사용자 정의 에러를 만드는 블루프린트입니다. 몇 가지 유용한 메서드를 포함하고 있어 에러에 대한 더 많은 정보를 얻을 수 있습니다. 함께 보겠습니다:

try {
throw new Exception("오우, 무언가 잘못되었습니다!", 42);
} catch (Exception $e) {
echo "에러 메시지: " . $e->getMessage() . "\n";
echo "에러 코드: " . $e->getCode() . "\n";
echo " 파일: " . $e->getFile() . "\n";
echo "라인: " . $e->getLine() . "\n";
}

이는 다음과 같은 내용을 출력합니다:

에러 메시지: 오우, 무언가 잘못되었습니다!
에러 코드: 42
파일: /path/to/your/file.php
라인: 2

이렇게 되면 에러에 대한 상세한 보고서를 얻을 수 있습니다.

여러 개의 Catch 블록: 다양한 문제에 대비하다

때로는 다양한 유형의 에러가 발생할 수 있으며, 이를 다르게 처리하고 싶을 수 있습니다. 여기서 여러 개의 catch 블록이 유용하게 사용됩니다. 이는 다양한 비상 상황에 대비한 전문가들이 준비되어 있는 것과 같습니다:

try {
$number = "abc";
if (!is_numeric($number)) {
throw new InvalidArgumentException("유효하지 않은 숫자입니다!");
}
$result = 10 / $number;
} catch (InvalidArgumentException $e) {
echo "유효하지 않은 입력: " . $e->getMessage();
} catch (DivisionByZeroError $e) {
echo "0으로 나눌 수 없습니다!";
} catch (Exception $e) {
echo "다른 어떤 에러가 발생했습니다: " . $e->getMessage();
}

이 예제에서 우리는 세 가지 다른 시나리오에 대비하고 있습니다: 유효하지 않은 입력, 0으로 나누기, 그리고 기타 예상치 못한 에러.

"Finally" 블록: 중요한 연산을 보장하다

"finally" 블록은 특정 연산이 발생했는지 상관없이 반드시 수행해야 할 중요한 연산을 보장할 때 필수적입니다. 이는 집을 나가기 전에 가스 불을 꺼야 하는 것과 같이 중요합니다 - 무엇이든 발생했는지 상관없이!

function divideNumbers($a, $b) {
try {
$result = $a / $b;
return $result;
} catch (Exception $e) {
echo "에러가 발생했습니다: " . $e->getMessage();
return null;
} finally {
echo "이것은 항상 실행됩니다!";
}
}

divideNumbers(10, 2);  // 출력: 이것은 항상 실행됩니다!
divideNumbers(10, 0);  // 출력: 에러가 발생했습니다: Division by zero, 이것은 항상 실행됩니다!

"Finally"와 Return: 주의할 점

"finally" 블록에서 "return" 문을 사용할 때는 주의가 필요합니다. "finally" 블록은 "try"나 "catch" 블록에서 "return" 문이 있어도 항상 실행됩니다. 이는 예상치 못한 동작을 초래할 수 있습니다:

function testReturn() {
try {
throw new Exception("이것은 예외입니다");
return "Try";
} catch (Exception $e) {
return "Catch";
} finally {
return "Finally";
}
}

echo testReturn();  // 출력: Finally

이 경우, "try"와 "catch" 블록 모두에 "return" 문이 있지만, 함수는 항상 "finally"에서 반환합니다.

마무리: 에러 처리 도구箱

축하합니다! 이제 PHP 에러 처리의 견고한 기초를 마련했습니다. 우리의 도구箱을 요약해보겠습니다:

도구 목적
try 예외를 던질 수 있는 코드가 들어 있습니다
throw 예외를 던지는 데 사용됩니다
catch 예외를 잡아 처리합니다
finally try와 catch 블록이 무엇이든 발생했는지 상관없이 실행됩니다
Exception 클래스 사용자 정의 예외를 만드는 블루프린트

좋은 에러 처리는 안전벨트를 착용하는 것과 같습니다 - 모든 것이 원활하게 진행되고 있을 때는 불필요할 수 있지만, 문제가 발생했을 때는 기꺼이 사용하게 될 것입니다!

이제 PHP가 던지는 모든 에러를 처리할 수 있는 자신감을 가지고 코드를 작성해보세요. 행복한 코딩 되세요, 예외가 항상 잡히길 바랍니다!

Credits: Image by storyset