PHP - try catch

octofox·2021년 5월 17일
0

PHP - errors

목록 보기
2/2

try catch 가 없는 에러 처리는 정말 복잡하고 어려웠다.
if 구문으로만 에러를 처리한다면...

<?php
if ($user_info['level'] != 1)
{
    if ($_POST['subject'])
    {
        if (isset($_POST['contents']))
        {
            if (mysqli_query($dbh, $sql))
            {
                echo("성공적으로 입력 되었습니다.");
            }
            else echo("입력 실패 하였습니다.");
        }
         else echo("내용을 입력하여 주세요.");
	}
	else echo("제목을 입력하여 주세요.");
}
else echo("글쓰기 권한이 없습니다.");

어디서 에러가 나는지... 중괄호는 짝이 맞는지...
찾기 힘들다! 어렵다! 귀찮다!

이런 식으로 if else 중첩 구문에 위 아래로 멀리 떨어져있는 집중하기 힘든 코드가 만들어진다. 흡사 nodeJS의 콜백 지옥과 같은 모습이다.
그리고 설령 에러가 나더라고 자동적으로 실행이 멈추지 않기 때문에 중간 중간에 break나 die를 사용해야 할 지도 모른다.

코드 가독성 측면에서 코드의 depth는 항상 낮게 유지하는 것이 좋다.

try catch는 그러한 문제들을 해결해준다.

<?php
try
{
if ($user_info['level'] != 1) throw new Exception('글쓰기 권한이 없습니다', 0);
if (!isset($_POST['subject'])) throw new Exception('제목을 입력해주세요.', 1);
if (!isset($_POST['contents'])) throw new Exception('내용을 입력해주세요.', 2);
if (!mysqli_query($dbh, $sql)) throw new Exception('입력 실패하였습니다.', 3);
	
    echo("성공적으로 입력 되었습니다.");
}
catch(Exception $e)
{
    switch ($e->getCode())
    {
        case 0:
            echo($e->getMessage());
        break;
        case 1:
            echo($e->getMessage());
        break;
        case 2:
            echo($e->getMessage());
        break;
        case 3:
            echo($e->getMessage());
        break;
        case 4:
            echo($e->getMessage());
        break;
    }
}

정말 간단명료하게 프로세스가 보인다.
try 안에서 throw가 실행되면 그 자체로 코드 실행을 멈추고 catch 문으로 점프하기 때문에 데이터 무결성에도 좋다.

예제에서는 에러 메세지만 출력하지만 php의 Exception 객체는 에러가 일어난 파일, 라인 까지
도 출력이 가능해서 오류가 나는 곳을 쉽게 찾을 수 있도록 도와준다.

$e->getLine();

$e->getFile();

try catch는 거의 모든 언어에서 채택한 구문이다.

제발 depth를 얕게 유지하자!

try - catch
만세!!!

profile
개발자라고 우기는 노답 소년

0개의 댓글