Menu
Coddy logo textTech

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 complete

finally 블록은 try 또는 catch 블록 내부에서 return하더라도 실행되므로, 필수적인 정리 작업에 신뢰성 있게 사용할 수 있습니다.

challenge icon

챌린지

쉬움

try-catch-finally가 함께 작동하여 errors를 우아하게 처리하는 동시에 cleanup이 always 수행되도록 하는 file processing system을 만들어 보겠습니다.

코드를 세 개의 file에 나누어 구성합니다:

  • FileException.php: Exception을 확장하는 custom FileException class를 Create합니다. 이 class는 시스템에서 file 관련 errors를 나타냅니다.
  • FileProcessor.php: file 작업을 시뮬레이션하는 FileProcessor class를 Create합니다. FileException file을 포함합니다. class에는 다음이 있어야 합니다:
    • false로 initialized된 private boolean 속성 $isOpen
    • $isOpentrue로 설정하고 "Opening: [filename]"을 출력하는 메서드 open(string $filename): void. filename이 "invalid.txt"이면 "Cannot open file"이라는 message와 함께 FileException을 발생시킵니다.
    • "Processing file..."을 출력하는 메서드 process(): void. $isOpenfalse이면 "File not open"이라는 message와 함께 RuntimeException을 발생시킵니다.
    • $isOpenfalse로 설정하고 "File closed"를 출력하는 메서드 close(): void
    • current 상태를 반환하는 메서드 isOpen(): bool
  • main.php: FileProcessor file을 포함합니다. 하나의 input, 즉 filename을 받습니다.

    FileProcessor를 Create하고 try-catch-finally 구조를 사용하여 다음을 수행합니다:

    • try block에서 filename과 함께 open()을 call한 다음 process()를 call합니다.
    • FileException을 first catch하고 "File error: [message]"를 출력합니다.
    • RuntimeException을 catch하고 "Runtime error: [message]"를 출력합니다.
    • finally block에서 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"

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러