본문 바로가기
Language/php

예외처리

by 잘먹는 개발자 에단 2024. 9. 9.

PHP에서의 예외처리

- PHP는 심각한 에러가 아니면 예외처리하지 않고, 최대한 계속 처리 시키는 것을 지향한다.

- 에러는 그냥 알림이고, 행복하게 계속 작업을 수행한다.

 

0. 에러심각도를 가진다. 

    ㄴ 에러 error : 치명적이며, 런타임 에러를 발생시킨다. 무조건 코드를 수정해야함

    ㄴ 알림 notice : 실행 중에 문제를 일으킬 가능성이 있는 코드. 런타임 에러 발생하지 않음.

    ㄴ 경고 warning : 치명적이지는 않은 에러. 런타임 에러 발생하지 않음.

 

1. 충분히 이상해보일 수 있고 적응이 안될 수 있음

    ㄴ 때문에 에러 보고 방식을 바꿀 수 있다.

    ㄴ 내장 php 함수인 error_reporting() 을 사용하면 해당 스크립트가 실행되는 동안 사용될 에러 레벨을 설정할 수 있다.

 

2. 에러 표시 옵션도 줄 수 있음

    ㄴ 웹 화면에 표시되게 할 것인지 ( 개발할 때 좋으나 배포할 때는 안좋음 )

    ㄴ 화면 표시 안하고 로그만 남길 것인지 ( 배포 시에 권장 )

    ㄴ 와 진짜 에러나도 지나간다. 

 

3. 코드 한 줄에 대한 에러 끄기/켜기 가 가능하다.

    ㄴ 에러 제어 연산자는 @이다.

    ㄴ 표현식의 시작 부분에 이 연산자를 붙이면 해당 표현식에서 발생하는 모든 에러가 표시되지 않는다.

<?php
error_reporting(E_ERROR | E_WARNING | E_NOTICE );

echo @$foo['bar'];

표현식 각각에 대한 에러 보기를 제어할 수 있는 것은 장단점이 존재하는데, 단점이 장점에 기인한다.

    ㄴ @ 연산자가 붙은 표현식을 처리할 때 @ 연산자가 없는 표현식보다 비효율적으로 처리한다.

    ㄴ 에러 제어 연산자는 에러를 완전히 감춰버린다. 표시도 되지않고, 로그에도 남지 않는다.

 

3-1. 그리고 의도대로 작동하지 않는 에러가 있다고 한다.

    - fopen() 과 관련된 에러로서, 리턴값을 100% 신뢰할 수 없는 경우이다.

    - 때문에 php에서 @을 사용하여 어떠한 에러를 처리할 때 리턴값을 100% 신뢰하지 않도록 한다.

 

    - 최대한 사용하지 않을 수 있다면 사용하지 말자.

    - 위에서 $foo['bar'] 앞에 @을 붙였으나 위의 경우에 에러가 표시될 수도 있다. ( 희박한 확률로 )

    - 그래서 널처리를 사용하는 것이 더 이상적이다.

        ㄴ echo $foo['bar'] ?? 'Exception';

        ㄴ ?? 는 php 7.0 이상부터 사용가능하다. 

 

3-2. 그렇다고 해서 기본 상태의 php에서 에러 제어 연산자 @의 동작을 끌 수 있는 방법이 없다.

    

 

 

그렇다면 php에서는 JS 처럼 예외를 적극적으로 사용할 수는 없을까?

 

기본적으로 '에러'를 '예외'로 던지면 쉽게 예외를 적극적으로 사용하는 언어로 동작하게 할 수 있다.

 

Exception 클래스를 상속한 ErrorException 예외를 사용해서 가능하다.

 

" 라라벨과 심포니 " 에서 이 방법을 사용한다.

 

예를 들어서 JS에서 로그인을 하려고 하는데, 여러 예외처리를 해줘야 한다.

 

아이디가 잘못되었을 수도 있고, 비번이 잘못되었을 수도 있고, 아예 계정이 없을 수도 있다.

 

 

예외 처리는 보통 다음의 구조를 따른다. JS 코드가 직관적으로 잘 보여주는 것 같아서 JS코드를 예시로 작성해보았다. 

const fetchInfoList = async() => {
    try{
    	// 로크인 api 코드로 뭘 막 하는 코드
        // return 0 : 로그인 성공
        // return 1 : 아이디 잘못
        // return 2 : 비번 잘못
        // return 3 : 계정 없음 
        switch(returnValue){
        	case 0 : 
            	// ~~~~~
            case 1 : 
            	// 예외 처리해주어야 한다.
                throw new Exception('아이디를 잘못 입력하셨습니다')
        	...
        }
        
    }catch(Exception ex){
    	// ex.Message로 해당 예외 메시지가 전달되고 이를 보여준다.
    }
}

 

 

'Language > php' 카테고리의 다른 글

캐싱 예시  (0) 2024.09.11
해시 테이블 사용하기  (0) 2024.09.11
폼 처리 - XSS 공격  (6) 2024.09.11
폼 처리  (4) 2024.09.09
자료구조 및 메서드  (1) 2024.09.09