try {} catch {}와 if {} else {}의 장점은 무엇입니까?
PHP의 일반 mysql에서 PDO로 전환 중이며 오류를 테스트하는 일반적인 방법은 if / else 조합 대신 try / catch 조합을 사용하는 것입니다.
이 방법의 장점은 무엇입니까? 여러 단계 (연결, 준비, 실행 등)에 대한 모든 오류를 처리하기 위해 여러 중첩 된 if / else 블록 대신 하나의 try / catch 블록을 사용할 수 있습니까?
서버 다운, 자격 증명 만료 또는 부정확과 같은 예외적 인 조건이없는 한 코드를 통한 정상적인 경로가 오류없이 진행되어야 할 때 try / catch 블록을 사용합니다. 나는 예외적이지 않은 오류를 처리하기 위해 반드시 그것을 사용하지는 않을 것입니다. 예를 들어 현재 사용자가 올바른 역할에 있지 않은 것처럼 말입니다. 즉, 예외적 인 조건이 아닌 오류를 합리적으로 예상하고 처리 할 수있을 때 확인을해야한다고 생각합니다.
위에서 설명한 경우 (쿼리 설정 및 수행) try / catch 블록은 일반적으로 쿼리가 성공할 것으로 예상하는대로 처리하는 훌륭한 방법입니다. 다른 한편으로, 사용자의 목적에 맞지 않을 수있는 데이터를 사용하려고 시도하는 것보다 결과의 내용이 제어 흐름 논리에서 기대하는 내용인지 확인하고 싶을 것입니다.
주의하고 싶은 한 가지는 try / catch를 잘못 사용하는 것입니다. Try / catch는 나쁜 프로그래밍으로부터 자신을 보호하는 데 사용되어서는 안됩니다. "이렇게하면 어떤 일이 일어날 지 모르기 때문에 try / catch로 래핑하고 최선을 다하기를 바랍니다." 프로그래밍의. 일반적으로 코드와 관련된 오류 (널 포인터 등)를 찾아 수정할 수 있도록 코드 자체와 관련이없는 예외 (서버 다운, 잘못된 자격 증명 등)로 포착하는 예외 유형을 제한 할 수 있습니다. .).
일반적으로 try-catch 블록은 예외가 발생할 때마다 중단 (catch 문으로 이동)되므로 훌륭합니다. If-else 블록은 오류 발생시기를 예측하는 데 의존합니다.
편집 : 또한 catch 블록은 오류가 발생했을 때 코드가 중지되는 것을 막지 않습니다.
try / catch의 장점과 일반적으로 예외는 PDO와 같은 라이브러리를 개발 하는 사람들에게 더 많은 것입니다 . 이를 통해 시스템 개발자는 정의되지 않은 상황이나 예상치 못한 결과를 빠르고 쉽게 처리 할 수 있습니다. 데이터베이스 연결을 가져옵니다. 데이터베이스에 도달 할 수없는 경우 시스템은 무엇을 해야 합니까? 실행을 중단해야합니까? 다시 시도하십시오? 경고를 던지고 계속 하시겠습니까? 시스템 개발자는 사용자가 수행해야하는 작업을 알 수 없으며 나중에 예외를 발생시켜 처리 할 수 있습니다.
시스템 소비자로서의 이점은 모호한 오류 코드를 되찾거나 실패했다는 단순한 부울 거짓을 얻는 것보다 Exception 객체를 얻는 것입니다.
무엇이 잘못되었는지 더 분명한 방식으로 이름을 지정하십시오.
예외가 발생한 이유 를 파악하는 데 도움이되는 메서드 및 속성을 포함 할 수 있습니다.
어쨌든 그것은 이론입니다. 예외가 갈 길이라고 주장하는 똑똑한 사람들이 많이 있습니다. 또한 예외가 악마라고 생각하고 게으른 시스템 개발자의 목발이라고 생각하는 똑똑한 사람들도 많이 있습니다. 이 문제에 대한 합의와 유사한 것은 없습니다.
Try / Catch는 오류 처리 논리를 개체 비즈니스 논리와 완전히 분리합니다.
예외를 던지고 잡는 것은 대부분의 다른 기본 작업에 비해 비용이 많이 드는 작업입니다. 이것이 잘 수행되어야하는 코드 조각이라면 (예를 들어, 타이트한 루프에서) 유스 케이스를보고 싶을 것입니다. 예외가 상대적으로 자주 발생한다고 예상한다면 if를 사용하는 것이 좋습니다. / else perforance-wise (기본 코드가 예외를 래핑하는 경우가 아니면 전혀 이득이없는 경우). 예외가 드문 경우에만 발생하는 경우, 타이트 루프에서 분기의 오버 헤드를 피하기 위해 try / catch를 사용하는 것이 좋습니다.
@Perchik :
나의 일반적인 오류 처리 철학 :
당신은 해야 당신이 기대하는 모든 경우를 처리 할 경우 / 다른 사용합니다. 모든 것을 처리하기 위해 try {} catch {}를 사용 해서는 안됩니다 (대부분의 경우). 유용한 Exception이 발생할 수 있고 여기에서 버그의 존재를 알 수 있기 때문입니다. 당신은 해야 어디 의심 뭔가 캔 / 잘못 될 것입니다 상황에서 시도 {} 잡기 {} 사용하고 네트워크 타임 아웃 / 파일 시스템 액세스 문제처럼, 그것은 전체 시스템을 가지고 싶어하지 않는 파일이 존재하지 않는 등 .
여러 if 문 대신 하나의 try / catch를 사용하는 것이 바로 이점입니다. 또한 예상치 못한 오류를 포착 할 수 있습니다.
PDO는 객체를 사용하고 있기 때문에 오류가 발생하면 Exception을 발생시킵니다. 이전 mysql / mysqli는 단순한 함수였으며 예외를 던지지 않았으며 단순히 오류 코드를 반환했습니다. Try / catch는 코드에서 예외가 발생할 수 있고 오류를 처리하는 객체 지향 방식 인 catch 절에서이를 catch 할 때 사용됩니다. if / else 블록으로 예외를 포착 할 수 없습니다. try / catch와 아무것도 공유하지 않습니다.
다른 사람들은 모두 좋은 답을 가지고 있었지만 나는 내 자신의 답을 던질 것이라고 생각했습니다.
- Try / Catch는 실제 예외 처리 메커니즘이므로 예외를 변경하면 모든 try / catch 문에서 자동으로 작동합니다.
- Try / Catch는 if / else를 죽일 수있는 주요 예외의 경우에도 코드를 실행할 수있는 기회를 제공하며 추가로 try 문을 롤백 할 수 있습니다 (숙련 된 경우).
PHP에서 상속과 함께 Try Catch를 사용하여 다른 클래스에서 예외를 던질 수 있습니다.
예 :-나는 controller
을 사용하여 사용자 데이터를 확인하고 Models
있습니다.
오류가 트리거되면 Model
메서드 에서 예외를 throw해야 합니다.
try의 실행은 중단되고 Catch
Block 에서 포착됩니다 .
따라서 bool 값을 반환하고 확인하는 오버 헤드가 적습니다.
이 외에도 Try Catch
체인에서 사용할 때 ( Try - Catch
다른 내부 Try - Catch
) 잘 작동합니다 .
@Jared Updike와 완전히 동의
일반적으로 예외 처리는 사용자가 그것에 대해 거의 또는 전혀 알지 못하는 상태에서 수행됩니다. 반면에 시스템 사용자는 if-else 블록 내부에서 일어나는 일에 대해 알고 있습니다.
예. ATM 사용자에게 잔액이 부족할 때 "은행 잔액 부족"메시지를 표시하는 "else"절이어야합니다. 그리고이 메시지는 어떤 이유로 든 "catch"블록 안에있을 수 없습니다!
a / b 나누기 코드를 작성 중이고 가장 유명한 예외 사례 (예 : 0 나누기 오류)가 발생했다고 가정 해 봅시다. 다음에 무엇을 할 수 있다고 생각하십니까? 1. 메시지를 인쇄하고 종료 할 수 있습니다. 2. 메시지를 인쇄하고 사용자가 값을 다시 입력하도록 할 수 있습니다.
다른 사람 / 공급 업체가 동일한 예외 사례를 다른 방식으로 처리하려는 경우가 있습니다. 캐치 블록은 그들을 쉽게이 작업을 수행 할 수 있습니다. 특정 예외 사례가 처리되는 방식을 변경해야하는 경우 catch 블록 만 변경하면됩니다.
ReferenceURL : https://stackoverflow.com/questions/651619/what-is-the-advantage-of-using-try-catch-versus-if-else
'Development Tip' 카테고리의 다른 글
이미지에서 로고 인식 (0) | 2020.12.25 |
---|---|
Java의 파일 이름이 공용 클래스 이름과 동일한 이유는 무엇입니까? (0) | 2020.12.25 |
파이썬에서 2의 보수 (0) | 2020.12.15 |
Linux에서 getch () 및 getche ()에 해당하는 것은 무엇입니까? (0) | 2020.12.15 |
Pylint의 파일 수준에서 "missing docstring"경고를 비활성화하려면 어떻게해야합니까? (0) | 2020.12.15 |