if {} else {}와 비교하여 try {} catch {}를 사용하면 어떤 이점이 있나요?
문제
나는 PHP의 일반 mysql에서 PDO로 전환하고 있으며 오류를 테스트하는 일반적인 방법은 if/else 조합 대신 try/catch 조합을 사용하는 것임을 알았습니다.
이 방법의 장점은 무엇입니까? 여러 단계(연결, 준비, 실행 등)에 대한 모든 오류를 처리하기 위해 중첩된 여러 if/else 블록 대신 하나의 try/catch 블록을 사용할 수 있습니까?
해결책
서버가 줄어들거나 자격 증명이 만료되거나 부정확 한 것과 같은 예외적 인 조건이 없으면 코드를 통한 일반 경로가 오류없이 진행될 때 시도/캐치 블록을 사용합니다. 현재 사용자가 올바른 역할을하지 않는 것처럼 예언이 아닌 오류를 처리하기 위해 반드시 사용하지는 않습니다. 즉, 예외적 인 조건이 아닌 오류를 합리적으로 기대하고 처리 할 수있을 때 수표를 수행해야한다고 생각합니다.
쿼리 설정 및 수행 및 수행에 대해 설명한 경우 시도/캐치 블록은 일반적으로 쿼리가 성공할 것으로 예상 할 때이를 처리하는 훌륭한 방법입니다. 반면에, 결과의 내용이 귀하의 목적에 유효하지 않은 데이터를 사용하려고 시도하는 대신 제어 흐름 로직에서 기대하는 것임을 확인하고 싶을 것입니다.
당신이 찾고 싶은 한 가지는 시도/캐치를 조잡하게 사용하는 것입니다. 시도/캐치는 나쁜 프로그래밍으로부터 자신을 보호하는 데 사용해서는 안됩니다. "이렇게하면 어떻게 될지 모르겠습니다. 프로그래밍의. 일반적으로 코드 자체 (서버 다운, 불량 자격 증명 등)와 관련이없는 예외를 제한하여 코드 관련 오류 (NULL 포인터 등)를 찾아 수정할 수 있습니다. .).
다른 팁
일반적으로, 시도-캐치 블록은 예외가 발생할 때마다 파손되기 때문에 훌륭합니다 (Catch 문으로 이동). IF-ELSE 블록은 오류가 발생하는시기를 예측하는 데 의존합니다.
편집 : 또한 캐치 블록은 오류가 발생할 때 코드가 중단되는 것을 중지하지 않습니다.
try/catch와 일반적으로 예외의 장점은 사람들에게 더 있습니다. 개발 중 PDO와 같은 라이브러리.이를 통해 시스템 개발자는 정의되지 않은 상황이나 예상치 못한 결과를 빠르고 쉽게 처리할 수 있습니다.데이터베이스 연결을 사용하세요.무엇 ~해야 한다 데이터베이스에 접근할 수 없는 경우 시스템이 수행합니다.실행을 중단해야 할까요?다시 시도하십시오?경고를 던지고 계속하시겠습니까?시스템 개발자는 사용자가 수행해야 할 작업이 무엇인지 알 수 없으며 나중에 포착하고 처리하게 될 예외를 발생시킵니다.
시스템 소비자로서 당신에게 이점은 모호한 오류 코드를 다시 받거나 실패했다는 단순한 부울 거짓을 얻는 것보다 Exception 객체를 얻는 것입니다.
무엇이 잘못되었는지 더 명확하게 알 수 있는 방식으로 이름을 지정하십시오(제 기억이 맞다면 PDO에는 하나의 예외 유형만 있지만 다른 시스템에는 다양한 종류의 오류에 대한 여러 예외 유형이 포함되어 있습니다).
알아내는 데 도움이 될 수 있는 메서드와 속성이 포함될 수 있으며 포함되어야 합니다. 왜 예외가 발생했습니다
어쨌든 그것은 이론입니다.예외가 좋은 방법이라고 주장하는 똑똑한 사람들이 많이 있습니다.예외가 악마이자 게으른 시스템 개발자의 버팀목이라고 생각하는 똑똑한 사람들도 많이 있습니다.이 문제에 대해서는 합의와 유사한 것이 없습니다.
시도/캐치는 객체 비즈니스 로직에서 오류 처리 로직을 완전히 분리합니다.
예외를 던지고 잡는 것은 대부분의 다른 원시 작업에 비해 비싼 작업입니다. 이것이 잘 수행되어야하는 코드 (예 : 단단한 루프)라면 사용 사례를보고 싶을 것입니다. 예외가 비교적 자주 발생할 것으로 예상하면 IF로 더 나을 것입니다. /else-perforance wise (기본 코드가 예외를 마무리하지 않는 한,이 경우 전혀 얻지 못합니다). 예외가 드문 상황에서만 던져지면 타이트한 루프에서 분기의 오버 헤드를 피하기 위해 시도/캐치가 더 좋습니다.
@perchik :
내 일반적인 오류 처리 철학 :
너 ~해야 한다 IF / ELSE를 사용하여 기대하는 모든 경우를 처리하십시오. 당신은해야합니다 ~ 아니다 처리하려면 {} catch {}를 사용하십시오 모든 것 (대부분의 경우) 유용한 예외를 제기 할 수 있고 버그의 존재에 대해 배울 수 있기 때문입니다. 너 ~해야 한다 시도 {} catch {}를 사용하여 무언가가 잘못 될 수 있고 잘못 될 수 있으며 네트워크 타임 아웃/파일 시스템 액세스 문제, 파일이 존재하지 않는 등 전체 시스템을 중단하고 싶지 않습니다.
그것은 여러 IF 문장 대신 하나의 시도/캐치를 사용하는 이점입니다. 또한 예상치 못한 오류를 포착 할 수 있습니다.
PDO는 객체를 사용하고 있으므로 오류가 발생하면 예외를 제외하고 있습니다. 오래된 MySQL/MySQLI는 단순한 기능이었으며 단순히 오류 코드를 반환 한 예외를 제외하지 않았습니다. Try/Catch는 코드에서 예외를 던질 수있는 경우 사용되며 Catch-Clause에서 잡을 수 있습니다. 이는 오류를 처리하는 객체 지향 방법입니다. IF/Else 블록으로 예외를 포착 할 수 없습니다. 시도/캐치와 아무것도 공유하지 않습니다.
다른 모든 사람들은 좋은 대답을 가지고 있었지만 나는 내 자신을 던질 것이라고 생각했다.
- Try/Catch는 실제 예외 처리 메커니즘입니다. 따라서 예외를 변경하면 모든 Try/Catch 문에서 자동으로 작동합니다.
- Try/Catch는 IF/Else를 죽일 수있는 주요 예외의 경우에도 코드를 실행할 수있는 기회를 제공하며, 시도 문을 롤백 할 수 있습니다 (정통한 경우).
PHP에서 Try Catch와의 내유를 사용하여 다른 클래스에서 예외를 던질 수 있습니다.
예 :- 나는 안에있다 controller
사용하여 사용자 데이터를 검증합니다 Models
.
오류가 발생하면 예외를 던져야합니다. Model
행동 양식.
시도의 실행은 Catch
차단하다.
따라서 Bool Vales를 반환하고 확인하는 오버 헤드가 적습니다.
이것과는 별도로 Try Catch
체인에서 사용할 때 잘 작동합니다 ( Try - Catch
다른 내부 Try - Catch
).
@jared updike에 완전히 동의하십시오
일반적으로 예외 처리는 사용자가 그것에 대해 거의 또는 전혀 알지 못하는 것으로 수행됩니다. 반면에 시스템 사용자는 IF-ELSE 블록 내에서 발생하는 일에 대해 알고 있습니다.
예를 들어. ATM 사용자를 보여주는 "else"조항이어야합니다. 그의 잔액이 낮을 때 "은행 잔액이 부족한"메시지를 표시해야합니다. 그리고이 메시지는 어떤 이유로 든 "캐치"블록 안에 앉아있을 수 없습니다 !!
우리가 A/B 부서 코드를 작성하고 있다고 가정 해 봅시다. 가장 유명한 예외 사례는 즉, 0 Divide 오류가 발생했다고 가정 해 봅시다. 다음에 무엇을 할 수 있다고 생각하십니까? 1. 메시지를 인쇄하고 종료 할 수 있습니다. 2. 메시지를 인쇄하고 사용자가 값 등을 다시 입력하게 할 수 있습니다.
다른 사람/공급 업체가 다른 방식으로 동일한 예외 사례를 처리하려는 경우가 있습니다. 그만큼 잡다 블록은 그들이 이것을 쉽게 할 수 있도록합니다. 특정 예외 케이스를 처리하는 방법을 변경 해야하는 경우 캐치 블록 만 변경하면됩니다.