Try, Catch, Finally
try/catch/finally 블록으로 실행 중 발생하는 예외를 우아하게 처리합니다.
Try, Catch, Finally은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
예외와 오류 비교
PHP에는 문제를 알리는 두 가지 방법이 있습니다:
- 오류 — 이전 강의에서 다룬 전통적인 PHP 알림/경고/치명적 오류
- 예외 — 예외적인 상황이 발생했을 때 던지는 객체이며 try/catch로 포착
예외는 복구 가능한 오류를 처리할 때 더 현대적이고 권장되는 방식입니다.
예외 던지기
다음과 같이 throw를 사용하여 문제가 발생했음을 알립니다:
<?php
function divide(float $a, float $b): float {
if ($b == 0) {
throw new InvalidArgumentException('Cannot divide by zero');
}
return $a / $b;
}
echo divide(10, 2); // 5
// divide(10, 0); // throws exceptiontry / catch 블록
예외를 발생시킬 수 있는 코드를 try로 감싸고 catch에서 예외를 처리하세요:
<?php
try {
$result = divide(10, 0);
echo $result;
} catch (InvalidArgumentException $e) {
echo 'Error: ' . $e->getMessage();
echo ' in ' . $e->getFile() . ':' . $e->getLine();
}여러 catch 블록
각기 다른 예외 유형을 별도의 catch 블록에서 포착하세요:
<?php
try {
$pdo = new PDO($dsn, $user, $pass);
$result = performQuery($pdo);
} catch (PDOException $e) {
error_log('DB error: ' . $e->getMessage());
echo 'Database unavailable';
} catch (RuntimeException $e) {
echo 'Runtime error: ' . $e->getMessage();
} catch (\Throwable $e) {
echo 'Unexpected error: ' . $e->getMessage();
}finally 블록
예외가 던져졌는지와 관계없이 finally는 실행되므로 정리 작업에 적합합니다:
<?php
$connection = null;
try {
$connection = openDatabaseConnection();
$data = fetchData($connection);
} catch (DatabaseException $e) {
error_log($e->getMessage());
echo 'DB error';
} finally {
// Always runs — even if exception was thrown
if ($connection) {
closeConnection($connection);
}
}예외 계층 구조
PHP의 예외 클래스 계층 구조:
Throwable(인터페이스)- ├─
Error— PHP 엔진 오류(TypeError, ParseError…) - └─
Exception— 애플리케이션 예외 - ├─
RuntimeException - ├─
InvalidArgumentException - ├─
LogicException - └─
PDOException
Throwable 포착
Throwable을 사용하여 예외와 PHP 오류를 모두 포착하세요:
<?php
try {
$result = someFunction();
} catch (\Exception $e) {
echo 'Exception: ' . $e->getMessage();
} catch (\Error $e) {
echo 'PHP Error: ' . $e->getMessage();
}
// Or catch both at once:
try {
// ...
} catch (\Throwable $e) {
echo get_class($e) . ': ' . $e->getMessage();
}유니온 예외 포착(PHP 8)
PHP 8에서는 하나의 catch 블록에서 여러 예외 유형을 포착할 수 있습니다:
<?php
try {
processRequest();
} catch (InvalidArgumentException | RuntimeException $e) {
echo 'Handled: ' . $e->getMessage();
}
// Compare PHP 7 approach:
// catch (InvalidArgumentException $e) { ... }
// catch (RuntimeException $e) { ... }예외 다시 던지기
예외를 포착하고 기록한 다음 다시 던져 호출 스택 위로 전달하세요:
<?php
function processOrder(int $id): void {
try {
$order = loadOrder($id);
$order->process();
} catch (PaymentException $e) {
error_log('Payment failed for order ' . $id . ': ' . $e->getMessage());
throw $e; // re-throw after logging
}
}예외 연결
컨텍스트를 유지하려면 원래 예외를 이전 예외로 전달하세요:
<?php
try {
$data = fetchFromAPI();
} catch (NetworkException $e) {
throw new ServiceUnavailableException(
'Cannot reach upstream service',
0,
$e // $previous — preserves original cause
);
}
// Retrieve original:
// $e->getPrevious()set_exception_handler
전역에서 포착되지 않은 예외 처리기를 등록하세요:
<?php
set_exception_handler(function(\Throwable $e): void {
error_log(sprintf(
'[UNCAUGHT] %s: %s in %s:%d',
get_class($e),
$e->getMessage(),
$e->getFile(),
$e->getLine()
));
http_response_code(500);
echo 'An unexpected error occurred. Please try again.';
exit(1);
});빠른 확인
예외가 던져지는지와 관계없이 반드시 실행되는 try/catch/finally 블록은 무엇입니까?
복습: try/catch/finally
예외 처리 요약:
throw new ExceptionClass()로 예외 던지기catch (Type $e)로 포착- 서로 다른 유형에는 여러 catch 블록 사용
finally는 항상 실행되므로 정리 작업에 사용- PHP 8 유니온 catch:
catch (A | B $e) - 호출 스택 컨텍스트를 유지하려면 예외를 다시 던지기
자주 묻는 질문
“Try, Catch, Finally” 강의는 무료인가요?
네 — “Try, Catch, Finally” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Try, Catch, Finally”에서 뭘 배우나요?
try/catch/finally 블록으로 실행 중 발생하는 예외를 우아하게 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
PHP Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Try, Catch, Finally” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- PHP 오류 유형 및 보고
- Try, Catch, Finally
- 사용자 정의 예외 만들기
- 오류 로깅 및 모범 사례