학습
PHP 예외 처리
PHP 예외 처리 — 중급
예외 처리
1. 도입 (왜 배워야 하는가)
예외 처리는 프로그래밍에서 필수적인 주제입니다. 실무에서는 예상치 못한 오류가 발생할 수 있으며, 이를 적절하게 처리하지 않으면 애플리케이션이 비정상적으로 종료되거나 사용자에게 불편을 초래할 수 있습니다. 예를 들어, 쇼핑몰에서 결제 과정 중 서버 오류가 발생하면 사용자는 결제가 제대로 이루어지지 않은 것으로 오해할 수 있습니다. 이러한 상황을 방지하기 위해 예외 처리를 통해 오류를 관리하고 사용자에게 친숙한 경험을 제공하는 것이 중요합니다.
예외 처리를 사용하지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 프로그램이 갑자기 종료되어 데이터 손실이 발생할 수 있습니다.
- 사용자에게 불친절한 에러 메시지가 출력되어 신뢰를 잃을 수 있습니다.
- 디버깅이 어려워져 코드 유지보수가 어려워집니다.
- try: 오류가 발생할 가능성이 있는 코드를 감싸는 블록입니다. 마치 위험한 작업을 안전하게 하도록 보호하는 장비와 같습니다.
- catch:
try블록에서 발생한 예외를 처리하는 부분입니다. 예외가 발생하면catch블록으로 제어가 넘어갑니다. - throw: 명시적으로 예외를 발생시키는 키워드입니다. 특정 조건에서 오류가 발생했음을 알릴 때 사용합니다.
- finally: 예외 발생 여부와 관계없이 항상 실행되는 블록입니다. 자원 해제와 같은 작업에 사용됩니다.
2. 핵심 개념 설명
예외 처리의 핵심 개념은 try, catch, throw, finally입니다. 각각의 개념을 이해하는 것이 중요합니다.
| 용어 | 설명 |
|---|---|
| try | 오류가 발생할 수 있는 코드 블록 |
| catch | 오류를 처리하는 코드 블록 |
| throw | 예외를 발생시키는 키워드 |
| finally | 항상 실행되는 코드 블록 |
3. 기본 코드 예제
아래는 PHP에서 예외 처리를 사용하는 가장 기본적인 코드 예제입니다.
<?php
function divide($numerator, $denominator) {
if ($denominator == 0) {
throw new Exception("0으로 나눌 수 없습니다."); // 예외를 발생시킴
}
return $numerator / $denominator; // 나눗셈 수행
}
try {
echo divide(10, 0); // 예외 발생
} catch (Exception $e) {
echo '예외가 발생했습니다: ' . $e->getMessage(); // 예외 처리
}
?>
실행 결과
예외가 발생했습니다: 0으로 나눌 수 없습니다.
코드 한 줄씩 동작 설명
function divide($numerator, $denominator) { ... }: 나눗셈을 수행하는 함수를 정의합니다.if ($denominator == 0) { ... }: 분모가 0인지 확인합니다.throw new Exception("0으로 나눌 수 없습니다.");: 분모가 0일 경우 예외를 발생시킵니다.return $numerator / $denominator;: 나눗셈을 수행하고 결과를 반환합니다.try { ... }: 예외 발생 가능성이 있는 코드를 감쌉니다.echo divide(10, 0);: 분모가 0인 경우 호출하여 예외를 발생시킵니다.catch (Exception $e) { ... }: 발생한 예외를 잡아서 처리합니다.echo '예외가 발생했습니다: ' . $e->getMessage();: 사용자에게 에러 메시지를 출력합니다.- 예외 처리는 프로그램의 안정성을 높여주며 사용자 경험을 개선합니다.
try,catch,throw,finally의 이해가 필수적입니다.- 예외를 적절하게 처리하여 오류 발생 시 사용자에게 친절한 메시지를 제공해야 합니다.
- 다음에 학습하면 좋은 주제는 에러 로깅입니다. 이를 통해 예외 발생 원인을 추적하고 분석할 수 있습니다.
4. 실전 활용 예제
예제 1: 쇼핑몰 결제 처리
쇼핑몰에서 고객의 결제 정보를 처리할 때 예외 처리를 사용할 수 있습니다.
<?php
function processPayment($amount) {
if ($amount <= 0) {
throw new Exception("결제 금액이 올바르지 않습니다."); // 금액 유효성 검사
}
// 결제 처리 로직...
return "결제가 완료되었습니다."; // 성공 메시지
}
try {
echo processPayment(-100); // 잘못된 금액으로 예외 발생
} catch (Exception $e) {
echo '결제 오류: ' . $e->getMessage(); // 오류 메시지 출력
}
?>
예제 2: 파일 읽기
파일에서 데이터를 읽을 때 파일이 존재하지 않거나 읽을 수 없는 경우를 처리합니다.
<?php
function readFileContent($fileName) {
if (!file_exists($fileName)) {
throw new Exception("파일이 존재하지 않습니다."); // 파일 존재 여부 확인
}
return file_get_contents($fileName); // 파일 내용 반환
}
try {
echo readFileContent("non_existent_file.txt"); // 존재하지 않는 파일로 예외 발생
} catch (Exception $e) {
echo '파일 오류: ' . $e->getMessage(); // 오류 메시지 출력
}
?>
5. 흔한 실수와 주의사항
실수 1: 예외를 잡지 않음
예외를 발생시키고도 이를 잡지 않으면 프로그램이 종료됩니다.
잘못된 코드:
echo divide(10, 0); // 예외 발생, 잡지 않음
올바른 코드:
try {
echo divide(10, 0); // 예외 발생, try로 감쌈
} catch (Exception $e) {
echo '예외가 발생했습니다: ' . $e->getMessage(); // 처리
}
실수 2: 모든 예외를 한 곳에서 처리
모든 예외를 한곳에서 처리하면 구체적인 오류를 알기 어렵습니다.
잘못된 코드:
try {
// 여러 코드
} catch (Exception $e) {
echo '오류 발생'; // 구체적인 정보 없음
}
올바른 코드:
try {
// 여러 코드
} catch (SpecificExceptionType $e) {
echo '특정 오류 발생: ' . $e->getMessage(); // 구체적인 정보 출력
}