질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요.

두루뭉실한 제목으로 여쭤보는 점 죄송합니다.

개발 중 궁금한 점이 발생해서 질문 남깁니다.

자바의 경우 메서드 실행 중 예외가 발생한 경우 메서드 자체에 예외선언을 하지 않는 한 

해당 메서드에서 catch를 잡지 않는 이상 에러가 발생하는 것으로 알고 있습니다.


이와 다르게 PHP의 경우 예외가 최초 호출한 곳까지 올라가는 형태로 알고 있습니다.

만약 아래와 같이  클래스가 있고 마지막 클래스에서 예외가 발생 했으면

중간의 클래스에서 자바처럼 다시 예외를 떠넘겨 줘야 하는지

아니면 PHP 특성이므로 a의 메서드에서 발생되는 예외에 대해 표시후 최초 호출지에서 처리 할지 고민중에 있습니다


이 부분에 대해 어떠하게 사용하시는지 여쭙니다.

1
<?php

class a {

    /**
     * @throws Exception
     */
    public function run()
    {
        $a = new b();
        $a->run();
    }
}

class b {
    public function run()
    {
        throw new Exception("예외처리필요!");
    }
}

$obj = new a();

try {
    $obj->run();
} catch (Exception $e) {
    // 예외처리!!
    // doSomething();
}



또는

2
<?php

class a {
    public function run()
    {
        $a = new b();
        try {
            $a->run();
        } catch (Exception $e) {
            throw $e;
        }

    }
}

class b {
    public function run()
    {
        throw new Exception("예외처리필요!");
    }
}

$obj = new a();

try {
    $obj->run();
} catch (Exception $e) {
    // 예외처리!!
    // doSomething();
}





    CommentAdd your comment...

    1 answer

    1.  
      2
      1
      0

      자바랑 다를 바 없을 것 같습니다. 

      1번, 2번 모두 유효한 문법이고, 2번의 경우 caller에서 catch를 했다면 rethrow 하는 것 맞습니다. 그렇지 않으면 2번에 catch에서 예외를 완전히 소비해 버리므로, 맨 아래 main으로 예외가 전달되지 않습니다.

      ---

      main도 캐치하지 못하는 예외를 위해 전역 예외 처리기 를 등록할 수도 있습니다. 프레임웍에서 전역 예외 처리기를 등록하고 사용하는 예제도 참고해주세요.

      https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php#L36

      ---

      PHP 는 컴파일 언어가 아니므로, REPL을 사용해서 편하게 코드를 실행해 볼 수 있습니다.

      // Vanilla PHP
      $ php -a
      
      
      // Laravel Framework
      $ php artisan tinker
      1. 조두희

        네, 답변감사드립니다.

        제가 여쭙고자 하였던 내용은 작동여부의 이외에

        a클래스에서 b클래스의 Exception 대한 어떠한 작업이 없더라도 명시적으로

        rethrow해야 하는가에 대한 내용이였습니다.  

        A클래스를 사용하는 대상에서는 a클래스의 해당 메서드만으로 어떠한 Exception이 발생할지 모른다고 생각했기 때문입니다.


        테스트해보니 phpdoc 만으로도 충분한거 같습니다.


        감사합니다 ^^


      CommentAdd your comment...