Try, Catch, Finally
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 68번째.
이제 예외를 생성하고 발생시키는 방법을 알았으므로, 예외를 catch하는 방법을 배워야 합니다. try-catch-finally 구조를 사용하면 예외로 인해 애플리케이션이 중단되도록 두는 대신 예외를 우아하게 처리할 수 있습니다.
예외를 발생시킬 수 있는 코드를 try 블록으로 감싼 다음, catch 블록에서 예외를 처리하세요:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
출력:
Error: Cannot divide by zero여러 개의 catch 블록을 사용하여 서로 다른 예외 유형을 catch할 수 있습니다. PHP는 이를 순서대로 확인하므로 더 구체적인 예외를 먼저 배치하세요:
<?php
try {
// 위험한 코드
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
finally block은 exception이 발생했는지 또는 catch되었는지와 관계없이 실행됩니다. 연결을 닫는 것과 같은 cleanup 작업에 적합합니다:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
출력:
Attempting operation
Caught: Failed
Cleanup completefinally 블록은 try 또는 catch 블록 내부에서 return하더라도 실행되므로, 필수적인 정리 작업에 신뢰성 있게 사용할 수 있습니다.
챌린지
쉬움try-catch-finally가 함께 작동하여 errors를 우아하게 처리하는 동시에 cleanup이 always 수행되도록 하는 file processing system을 만들어 보겠습니다.
코드를 세 개의 file에 나누어 구성합니다:
FileException.php:Exception을 확장하는 customFileExceptionclass를 Create합니다. 이 class는 시스템에서 file 관련 errors를 나타냅니다.FileProcessor.php: file 작업을 시뮬레이션하는FileProcessorclass를 Create합니다. FileException file을 포함합니다. class에는 다음이 있어야 합니다:false로 initialized된 private boolean 속성$isOpen$isOpen을true로 설정하고"Opening: [filename]"을 출력하는 메서드open(string $filename): void. filename이"invalid.txt"이면"Cannot open file"이라는 message와 함께FileException을 발생시킵니다."Processing file..."을 출력하는 메서드process(): void.$isOpen이false이면"File not open"이라는 message와 함께RuntimeException을 발생시킵니다.$isOpen을false로 설정하고"File closed"를 출력하는 메서드close(): void- current 상태를 반환하는 메서드
isOpen(): bool
main.php: FileProcessor file을 포함합니다. 하나의 input, 즉 filename을 받습니다.FileProcessor를 Create하고try-catch-finally구조를 사용하여 다음을 수행합니다:tryblock에서 filename과 함께open()을 call한 다음process()를 call합니다.FileException을 first catch하고"File error: [message]"를 출력합니다.RuntimeException을 catch하고"Runtime error: [message]"를 출력합니다.finallyblock에서isOpen()을 사용하여 file이 열려 있는지 check하고, 그렇다면close()를 call합니다. 그런 다음"Cleanup complete"를 출력합니다.
finally block은 작업이 성공하든 실패하든 cleanup이 수행되도록 보장합니다. 이 패턴은 처리 중에 어떤 일이 발생하든 cleanup이 이루어져야 하는 file, 데이터베이스 연결 또는 네트워크 소켓과 같은 리소스를 관리하는 데 essential합니다.
직접 해보기
<?php
require_once 'FileProcessor.php';
// 입력 읽기
$filename = trim(fgets(STDIN));
// TODO: FileProcessor 인스턴스 생성
// TODO: try-catch-finally 구조 사용:
// - try 블록에서: filename으로 open()을 호출한 다음 process() 호출
// - 먼저 FileException을 catch하고 "File error: [message]" 출력
// - RuntimeException을 catch하고 "Runtime error: [message]" 출력
// - finally 블록에서: isOpen()으로 파일이 열려 있는지 확인하고, 열려 있으면 close() 호출
// Then print "Cleanup complete"
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러