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
만세!!!