PHP에서 try...catch 블록을 효율적으로 사용하는 방법
저는 try를 사용하고 있습니다.내 PHP 코드에 있는 catch blocks를 사용했는데, 내가 제대로 사용하고 있었는지 모르겠다.
예를 들어, 코드 중 일부는 다음과 같습니다.
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
$tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (Exception $e) {
return $e;
}
트랜잭션 중 하나에서 예외가 발생하면 처리할 수 있기 때문에 여러 데이터베이스 작업을 동일한 try/catch 블록으로 그룹화합니다.
이 방법을 사용하는 이유는 다음 방법보다 읽기 쉽고 효율적이기 때문입니다.
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
} catch (Exception $e) {
return $e;
}
try {
$tableBresults = $dbHandler->doSomethingWithTableB();
} catch (Exception $e) {
return $e;
}
하지만, 내가 하고 있는 것이 좋은 연습인지 아니면 그저 예외를 잡는 게으른 방법인지 잘 모르겠다.
특수한 처리를 필요로 하는 예외에만 독자적인 try/catch block이 있어야 하며, 그렇지 않으면 같은 try/catch로 그룹화할 수 있어야 합니다.
그래서 질문하겠습니다.
데이터베이스 트랜잭션별로 try/catch 블록을 사용하면 어떤 이점이 있습니까?아니면 여러 데이터베이스 트랜잭션을 같은 try/catch 블록으로 문제없이 그룹화할 수 있습니까?
try/catch blocks를 nest 해도 될까요?감사합니다!
편집
catch()저는 그 메서드에 AJAX 요청을 하고 Javascript는 JSON 오브젝트를 상정하고 있기 때문에 예외가 발생하면 빈 JSON 부호화 배열을 반환합니다.구체적인 코드를 예시에 넣는다고 해서 가치가 있는 것은 아니라고 생각했습니다.
중요사항
다음 설명에서는 위의 예시와 같이 구조화된 코드를 말하는 것을 전제로 하고 있습니다.어떤 대안이 선택되든 예외에 의해 메서드는 논리적으로 도중에 동작을 정지합니다.
을 할 이라면, 어떤 문장이든 상관없습니다.try 때문에 의 블록으로 그러면 확실히 싱글을 사용하는 것이 좋습니다.try/catch §:
function createCar()
{
try {
install_engine();
install_brakes();
} catch (Exception $e) {
die("I could not create a car");
}
}
★★try/catch블록은 장애의 원인을 특정하는 방법으로 장애를 처리할 수 있는 경우에 도움이 됩니다.
function makeCocktail()
{
try {
pour_ingredients();
stir();
} catch (Exception $e) {
die("I could not make you a cocktail");
}
try {
put_decorative_umbrella();
} catch (Exception $e) {
echo "We 're out of umbrellas, but the drink itself is fine"
}
}
후세를 위해서라도 답이 너무 늦을지도 몰라변수의 반환 값을 확인하고 예외를 발생시켜야 합니다.이 경우 예외 발생 위치에서 캐치 블록으로 프로그램이 이동할 수 있습니다.이하를 참조해 주세요.
try{
$tableAresults = $dbHandler->doSomethingWithTableA();
if (!tableAresults)
throw new Exception('Problem with tableAresults');
$tableBresults = $dbHandler->doSomethingElseWithTableB();
if (!tableBresults)
throw new Exception('Problem with tableBresults');
} catch (Exception $e) {
echo $e->getMessage();
}
한 번 시도 캐치 블록이 더 읽기 쉽습니다.중요한 오류의 종류를 식별하는 경우 예외를 맞춤화할 것을 권장합니다.
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
$tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (TableAException $e){
throw $e;
} catch (Exception $e) {
throw $e;
}
여러 작업에 대해 단일 블록을 사용할 이유가 없습니다. 예외가 발생하면 실패한 블록 이후에 추가 작업이 수행되지 않기 때문입니다.적어도 검출된 예외로부터 실패한 조작을 단정할 수 있는 한.일부 작업이 처리되지 않으면 됩니다.
그러나 예외를 반환하는 것은 제한적인 의미에 불과하다고 생각합니다.함수의 반환값은 예외가 아니라 일부 액션의 예상 결과여야 합니다.호출 범위 내의 예외에 대응할 필요가 있는 경우는, 여기서의 함수내에서 예외를 검출하지 않고, 호출 범위내에서 검출하거나, 디버깅로깅 등을 실행한 후에 나중에 처리할 수 있도록 예외를 재투입합니다.
예외가 발생하면 실행이 즉시 중지되고 다음 위치에서 계속됩니다.catch{}즉, 같은 장소에 데이터베이스 콜을 발신하면try{}블록 및$tableAresults = $dbHandler->doSomethingWithTableA();예외를 던지고,$tableBresults = $dbHandler->doSomethingElseWithTableB();발생하지 않습니다.두 번째 선택지는$tableBresults = $dbHandler->doSomethingElseWithTableB();다음 시간이기 때문에 계속 발생하게 됩니다.catch{}block(실행이 재개되었을 때).
모든 상황에 이상적인 옵션은 없습니다.두 번째 작업을 계속 진행하려면 두 개의 블록을 사용해야 합니다.두 번째 작업을 수행하지 않는 것이 허용될 경우(또는 바람직할 경우) 하나만 사용해야 합니다.
한 번의 시도 캐치 블록으로 모든 작업을 수행할 수 있습니다.특정 오류에 대해 자신의 메시지를 표시할 경우 다른 캐치 블록에서 오류를 포착하는 것이 가장 좋습니다.
try
{
$tableAresults = $dbHandler->doSomethingWithTableA();
if(!tableAresults)
{
throw new Exception('Problem with tableAresults');
}
$tableBresults = $dbHandler->doSomethingElseWithTableB();
if(!tableBresults)
{
throw new Exception('Problem with tableBresults');
}
} catch (Exception $e)
{
echo $e->getMessage();
}
아래와 같이 한 번의 시도 캐치 블록으로 여러 줄의 실행 내용을 작성해도 문제가 없습니다.
try{
install_engine();
install_break();
}
catch(Exception $e){
show_exception($e->getMessage());
}
어느 한 곳에서든 실행이 발생하는 순간install_engine또는install_break함수는 catch 함수로 컨트롤이 전달됩니다.한 가지 더 추천할 것은 당신의 예외를 적절히 먹는 것이다.그 말은 글을 쓰는 대신die('Message')항상 예외 프로세스를 적절하게 수행하는 것이 좋습니다.사용하실 수 있습니다.die()에러 처리에서는 기능하지만 예외 처리에서는 기능하지 않습니다.
여러 번 시도 캐치 블록을 사용해야 하는 경우 다른 코드 블록 예외에 다른 유형의 예외가 표시되도록 하거나 다음과 같이 캐치 블록에서 예외를 발생시키려고 할 경우 여러 번 시도 캐치 블록을 고려할 수 있습니다.
try{
install_engine();
install_break();
}
catch(Exception $e){
show_exception($e->getMessage());
}
try{
install_body();
paint_body();
install_interiour();
}
catch(Exception $e){
throw new exception('Body Makeover faield')
}
언급URL : https://stackoverflow.com/questions/17549584/how-to-efficiently-use-try-catch-blocks-in-php
'programing' 카테고리의 다른 글
| 함수를 호출할 때 "throws Exception"이 필요한 이유는 무엇입니까? (0) | 2022.11.04 |
|---|---|
| Larabel 알 수 없는 열 'updated_at' (0) | 2022.11.04 |
| require, include, require_once와 include_once의 차이는 무엇입니까? (0) | 2022.11.04 |
| 상속이 있는 @Data 주석 lombok의 warning equals/hashCode (0) | 2022.11.04 |
| SQL: 주어진 모든 값을 가진 그룹만 선택하려면 어떻게 해야 합니까? (0) | 2022.11.04 |