if {} else {}와 비교하여 try {} catch {}를 사용하면 어떤 이점이 있나요?

StackOverflow https://stackoverflow.com/questions/651619

  •  19-08-2019
  •  | 
  •  

문제

나는 PHP의 일반 mysql에서 PDO로 전환하고 있으며 오류를 테스트하는 일반적인 방법은 if/else 조합 대신 try/catch 조합을 사용하는 것임을 알았습니다.

이 방법의 장점은 무엇입니까? 여러 단계(연결, 준비, 실행 등)에 대한 모든 오류를 처리하기 위해 중첩된 여러 if/else 블록 대신 하나의 try/catch 블록을 사용할 수 있습니까?

도움이 되었습니까?

해결책

서버가 줄어들거나 자격 증명이 만료되거나 부정확 한 것과 같은 예외적 인 조건이 없으면 코드를 통한 일반 경로가 오류없이 진행될 때 시도/캐치 블록을 사용합니다. 현재 사용자가 올바른 역할을하지 않는 것처럼 예언이 아닌 오류를 처리하기 위해 반드시 사용하지는 않습니다. 즉, 예외적 인 조건이 아닌 오류를 합리적으로 기대하고 처리 할 수있을 때 수표를 수행해야한다고 생각합니다.

쿼리 설정 및 수행 및 수행에 대해 설명한 경우 시도/캐치 블록은 일반적으로 쿼리가 성공할 것으로 예상 할 때이를 처리하는 훌륭한 방법입니다. 반면에, 결과의 내용이 귀하의 목적에 유효하지 않은 데이터를 사용하려고 시도하는 대신 제어 흐름 로직에서 기대하는 것임을 확인하고 싶을 것입니다.

당신이 찾고 싶은 한 가지는 시도/캐치를 조잡하게 사용하는 것입니다. 시도/캐치는 나쁜 프로그래밍으로부터 자신을 보호하는 데 사용해서는 안됩니다. "이렇게하면 어떻게 될지 모르겠습니다. 프로그래밍의. 일반적으로 코드 자체 (서버 다운, 불량 자격 증명 등)와 관련이없는 예외를 제한하여 코드 관련 오류 (NULL 포인터 등)를 찾아 수정할 수 있습니다. .).

다른 팁

일반적으로, 시도-캐치 블록은 예외가 발생할 때마다 파손되기 때문에 훌륭합니다 (Catch 문으로 이동). IF-ELSE 블록은 오류가 발생하는시기를 예측하는 데 의존합니다.

편집 : 또한 캐치 블록은 오류가 발생할 때 코드가 중단되는 것을 중지하지 않습니다.

try/catch와 일반적으로 예외의 장점은 사람들에게 더 있습니다. 개발 중 PDO와 같은 라이브러리.이를 통해 시스템 개발자는 정의되지 않은 상황이나 예상치 못한 결과를 빠르고 쉽게 처리할 수 있습니다.데이터베이스 연결을 사용하세요.무엇 ~해야 한다 데이터베이스에 접근할 수 없는 경우 시스템이 수행합니다.실행을 중단해야 할까요?다시 시도하십시오?경고를 던지고 계속하시겠습니까?시스템 개발자는 사용자가 수행해야 할 작업이 무엇인지 알 수 없으며 나중에 포착하고 처리하게 될 예외를 발생시킵니다.

시스템 소비자로서 당신에게 이점은 모호한 오류 코드를 다시 받거나 실패했다는 단순한 부울 거짓을 얻는 것보다 Exception 객체를 얻는 것입니다.

  1. 무엇이 잘못되었는지 더 명확하게 알 수 있는 방식으로 이름을 지정하십시오(제 기억이 맞다면 PDO에는 하나의 예외 유형만 있지만 다른 시스템에는 다양한 종류의 오류에 대한 여러 예외 유형이 포함되어 있습니다).

  2. 알아내는 데 도움이 될 수 있는 메서드와 속성이 포함될 수 있으며 포함되어야 합니다. 예외가 발생했습니다

어쨌든 그것은 이론입니다.예외가 좋은 방법이라고 주장하는 똑똑한 사람들이 많이 있습니다.예외가 악마이자 게으른 시스템 개발자의 버팀목이라고 생각하는 똑똑한 사람들도 많이 있습니다.이 문제에 대해서는 합의와 유사한 것이 없습니다.

시도/캐치는 객체 비즈니스 로직에서 오류 처리 로직을 완전히 분리합니다.

예외를 던지고 잡는 것은 대부분의 다른 원시 작업에 비해 비싼 작업입니다. 이것이 잘 수행되어야하는 코드 (예 : 단단한 루프)라면 사용 사례를보고 싶을 것입니다. 예외가 비교적 자주 발생할 것으로 예상하면 IF로 더 나을 것입니다. /else-perforance wise (기본 코드가 예외를 마무리하지 않는 한,이 경우 전혀 얻지 못합니다). 예외가 드문 상황에서만 던져지면 타이트한 루프에서 분기의 오버 헤드를 피하기 위해 시도/캐치가 더 좋습니다.

@perchik :

내 일반적인 오류 처리 철학 :

~해야 한다 IF / ELSE를 사용하여 기대하는 모든 경우를 처리하십시오. 당신은해야합니다 ~ 아니다 처리하려면 {} catch {}를 사용하십시오 모든 것 (대부분의 경우) 유용한 예외를 제기 할 수 있고 버그의 존재에 대해 배울 수 있기 때문입니다. 너 ~해야 한다 시도 {} catch {}를 사용하여 무언가가 잘못 될 수 있고 잘못 될 수 있으며 네트워크 타임 아웃/파일 시스템 액세스 문제, 파일이 존재하지 않는 등 전체 시스템을 중단하고 싶지 않습니다.

vexing 예외

그것은 여러 IF 문장 대신 하나의 시도/캐치를 사용하는 이점입니다. 또한 예상치 못한 오류를 포착 할 수 있습니다.

PDO는 객체를 사용하고 있으므로 오류가 발생하면 예외를 제외하고 있습니다. 오래된 MySQL/MySQLI는 단순한 기능이었으며 단순히 오류 코드를 반환 한 예외를 제외하지 않았습니다. Try/Catch는 코드에서 예외를 던질 수있는 경우 사용되며 Catch-Clause에서 잡을 수 있습니다. 이는 오류를 처리하는 객체 지향 방법입니다. IF/Else 블록으로 예외를 포착 할 수 없습니다. 시도/캐치와 아무것도 공유하지 않습니다.

다른 모든 사람들은 좋은 대답을 가지고 있었지만 나는 내 자신을 던질 것이라고 생각했다.

  1. Try/Catch는 실제 예외 처리 메커니즘입니다. 따라서 예외를 변경하면 모든 Try/Catch 문에서 자동으로 작동합니다.
  2. 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. 메시지를 인쇄하고 사용자가 값 등을 다시 입력하게 할 수 있습니다.

다른 사람/공급 업체가 다른 방식으로 동일한 예외 사례를 처리하려는 경우가 있습니다. 그만큼 잡다 블록은 그들이 이것을 쉽게 할 수 있도록합니다. 특정 예외 케이스를 처리하는 방법을 변경 해야하는 경우 캐치 블록 만 변경하면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top