예외처리에 대해 알아보자

김석재·2025년 1월 12일
0

예외 처리를 보기 전에 알아둘 기본 개념

객체지향 프로그래밍(Object-Oriented Programming)

객체지향 프로그래밍(OOP)란? : 절차지향적 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 하는 방법. 객체를 중심으로 프로그램을 설계, 개발함

  • OOP 의 주요 원칙
  1. SRP(Single Responsibility Principle)
    • 클래스는 단 하나는 책임만 가져야 함
  2. OCP(Open/Closed Principle)
    • 클래스는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 함
  3. LSP(Liskov Substitution Principle)
    • 자식 클래스는 부모 클래스와 교체 가능해야 함
  4. ISP(Interface Segregation Principle)
    • 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 함
  5. DIP(Dependency Inversion Principle)
    • 고수준 모듈은 저수준 모듈에 의존하지 않고, 둘 다 추상화에 의존해야 함
  • OOP 의 장점
  1. 코드 재사용성 증가
  2. 유지보수의 용이
  3. 코드 확장성 높아짐
  4. 시스템을 단순화한 설계가 가능
  • OOP 의 단점
  1. 설계의 복잡도 증가 가능
  2. 설계 방향에 따라 코드가 무거워질 가능성 있음
  3. 작은 프로젝트에 적합하지 않을 수 있음
  • 주요 개념
  1. 클래스(Class)

    • 객체를 만들기 위한 설계도
    • 속성(데이터, 변수)과 메서드(기능, 함수)를 포함
    class Car {
    public $color;
    public $brand;
    
    public function drive() {
        echo "Driving the car!";
    	}
    }
  2. 객체(Object)

    • 클래스를 인스턴스화해서 만들어진 구체적인 사물 또는 개념
    • 클래스의 속성과 메서드를 실제로 사용할 수 있는 형태
    $car = new Car();
    $car->color = "Red";
    echo $car->color; // 출력: Red
    $car->drive(); // 출력: Driving the car!
  3. 캡슐화(Encapsulation)

    • 객체의 속성과 메서드를 하나의 단위로 묶어 외부에서의 접근을 제한하는 것
    • 주로 접근 제한자(public, protected, private) 사용
  4. 상속(Inheritance)

    • 이미 정의된 클래스를 기반으로 새로운 클래스를 생성해서 기존 클래스의 속성과 메서드를 물려받는것
    • 코드의 재사용성을 높이고 계층 구조를 만듦
    class Vehicle {
    public $type;
    
    public function move() {
        echo "Moving!";
    	}
    }
    
    class Car extends Vehicle {
        public $brand;
    }
  5. 다형성(Polymorphism)

    • 같은 이름의 메서드를 사용하지만, 다른 기능을 하는 것
    • 오버라이딩(Overriding) : 부모 클래스의 메서드를 자식 클래스에서 재정의
  6. 추상화(Abstraction)

    • 불필요한 구현 세부사항을 숨기고 필요 기능만 외부에 제공함
    • 추상 클래스와 인터페이스를 사용

예외 처리, 예외 처리 계층과 종류

예외처리

예외처리란? : 객체 지향 프로그래밍(OOP)에서 오류 상황을 처리하는 방법중 하나. 예외처리를 통해 프로그램이 예상치 못한 상황을 제어하고 적절한 대응을 할 수 있음

  • 예외(Exception)
    예외는 프로그램의 실행 중 발생하는 에러나 상황을 나타내는 객체. 일반적으로 코드 실행 중에 발생하는 오류를 처리하기 위해 사용.
    예외는 특정한 예외 클래스로 표현되고, 예외 클래스는 예외 발생 시 정보를 담고 있는 속성과 예외 처리를 위한 메서드를 가지고 있음.

  • 예외 처리 방법
    try-catch 문을 사용해 구현.
    try 블록 내에서 예외가 발생할 수 있는 코드를 실행하고, catch 블록에서 예외를 처리하는 방식
    예외 발생 시 try 블록의 실행이 중단되고, 해당 예외를 처리할 수 있는 catch 블록이 실행됨.
    여러 개의 catch 블록을 사용하면 다양한 예외를 처리할 수 있음. 예외 클래스의 계층 구조를 활용해서 상위 예외 클래스부터 하위 예외 클래스로 처리 가능

  • 예외 계층 구조
    PHP 에서 예외 처리 계층은 아래와 같음.

    Throwable -> Exception & Error -> 각각의 세부 클래스(RuntimeException, LoginException 혹은 TypeError, ParseError 등등)

Throwable

  • PHP 예외 처리의 최상위 인터페이스. 모든 예외와 오류 객체는 해당 인터페이스를 구현함.
  • Exception 과 Error 는 Throwable 의 주요 구현체.
try {
    throw new Error("에러 출력");
} catch (Throwable $t) {
    echo "출력 : " . $t->getMessage();
}
  • Throwable 을 통해 객체 지향적 예외 처리가 가능함.
  • Throwable 에서 제공하는 메서드로는 이런 것들이 있음.
    $t->getMessage() // 예외 혹은 에러의 메시지 반환
     $t->getCode() // 예외 혹은 에러의 코드(정수)를 반환
     $t->getFile() // 예외 혹은 에러가 발생한 파일 경로 반환
     $t->getLine() // 예외 혹은 에러가 발생한 파일 라인 번호 반환
     $t->getTrace() // 예외 혹은 에러의 스택 트레이스를 배열 형태 반환
     $t->getTraceAsString() // 예외 혹은 에러의 스택 트레이스를 문자열 형태 반환
     $t->__toString() // 예외 혹은 에러 객체를 문자열로 표현

Exception

  • Exception 클래스는 Throwable 에서 정의된 메서드 getMessage(), getCode() 등을 상속받아 사용 가능.

  • 애플리케이션 실행 중에 발생하는 예외를 다루고 있는데, Error 는 치명적인 오류인데 반해 Exception 은 복구가 가능한 오류를 나타냄

  • Exception 클래스는 크게 LogicException 과 RuntimeException 이 있고 하위 클래스를 가진 계층 구조

    // Exception 의 대표적인 클래스들 계층 구조
    Exception
    ├── LogicException
    │   ├── BadMethodCallException
    │   ├── DomainException
    │   ├── InvalidArgumentException
    │   ├── LengthException
    │   └── OutOfBoundsException
    ├── RuntimeException
        ├── OutOfRangeException
        ├── OverflowException
        ├── UnderflowException
        └── UnexpectedValueException
  • Exception 클래스를 확장하면 사용자 정의 예외 클래스를 생성할 수 있음

  • Exception 클래스의 생성자

    __construct(string $message = "", int $code = 0, ?Throwable $previous = null)

    $message : 예외 메시지로 기본값은 빈 문자열
    $code : 예외 코드(정수)로 기본값은 0
    $previous : 이전 예외를 연결할 때 사용

  • 예외 처리 키워드로는 try, catch, finally, throw 가 있음
    - try : 예외 발생 가능성 있는 코드 실행 블럭
    - catch : 발생한 예외 처리 블럭
    - finally : 예외 발생 여부와 상관없이 실행되는 블럭
    - throw : 예외를 명시적으로 발생

  • 예외 체인(Previous Exception)을 사용해 여러 예외를 연결할 수 있음

    try {
        try {
            throw new Exception("첫번째 예외");
        } catch (Exception $e) {
            throw new Exception("두번째 예외", 0, $e);
        }
    } catch (Exception $e) {
        echo "Msg: " . $e->getMessage() . "\n";
        echo "Previous: " . $e->getPrevious()->getMessage();
    }

Error

  • Exception 과 동일하게 Throwable 의 구현체이기 때문에 Throwable 의 메서드들을 사용 가능함

  • Error 클래스는 치명적인 오류를 객체로 처리할 수 있도록 제공되는 클래스라는 차이점이 있고 PHP 엔진에서 자동으로 발생하는 오류임. 나머지는 Exception 과 유사함

  • Exception 과 동일한 생성자 형태를 가지고 있음

  • Error 의 주요 하위 클래스

    Throwable
    └── Error
        ├── TypeError
        ├── ParseError
        ├── ArithmeticError
        │   └── DivisionByZeroError
        └── AssertionError

0개의 댓글