2013-01-31 1 views
0

PHP와 프로그래밍에 대한 충분한 경험이 없으므로 제 상황에 가장 적합한 결정이 무엇인지 알고 싶습니다. 내가 키 $type 배열 $ascii_array을 위해 존재하는지 확인하려면PHP : 아래의 경우 예외 처리 방법

public static function isAscii($string, $type, $length = -1) 
    { 
     if (!is_string($string)) 
      throw new InternalException(ExceptionMessage::invalidFunctionParameterType(__CLASS__, __METHOD__)); 

     if ($length !== -1 && !Str::isValidLength($string, $length)) 
      return FALSE; 

     $ascii_array = Constants::asciiRegex(); 

     if (!preg_match($ascii_array[$type], $string)) 
      return FALSE; 

     return TRUE; 
    } 

: 여기 내 코드 샘플입니다. 그렇게하는 가장 좋은 방법은 무엇입니까?

  1. 간단한 :

    나는이 결정을 제공 할 수 있습니다. array_key_exists() 기능으로 키 존재를 수동으로 확인하십시오. key가 존재하지 않으면 예외를 throw합니다. 그러나 나는 좋은 생각이 아니며이 조건을 검사하는 것은 중복이다. 왜냐하면 PHP 컴파일러는 아무 것도 쓰지 않으면 경고를 생성하기 때문에 (Notice : Undefined index :) 나는 이것을 어떻게 든 사용하고 싶다. OutOfBoundsExceptionOutOfRangeException과 같은 미리 정의 된 예외가있는 것으로 밝혀졌습니다. Java 에서처럼 쉽게 사용할 수 있지만 PHP는 이러한 예외를 발생시키지 않으며 경고 및 오류 만 표시합니다.

  2. set_error_handler()을 사용하면 오류 및 경고를 예외로 '변환'할 수 있습니다. 그러나 또 다른 문제가 있습니다. 가능한 모든 오류를 어떻게 처리 할 수 ​​있습니까? PHP 오류 및 경고의 전체 목록을 찾으려고했지만 it doesn't exist. 그래서이 문제를 해결하는 방법을 모릅니다. 제발 도와주세요. 미리 감사드립니다. 제 영어 실력이 떨어지는 경우에도 제 질문을 이해하길 바랍니다.

P. 이것은 여러 유형의 ASCII 문자열에 대한 정규 표현식을 사용하는 배열입니다. enter image description here

+0

만약 배열에 배열되어 있는지 확인하고 싶다면'in_array'를 사용하십시오. - 여기서 예외로 무엇을하려고합니까? 즉'false '를 반환하는 것과 예외를 던지는 것의 차이점은 무엇입니까? 또는 말하십시오 : 원하는 결과는 무엇입니까? 앱이 다르게 동작해야합니까? – dognose

+0

문자열이 ascii인지 여부를 간단히 알리려고하면 함수가 복잡해지기 쉽습니다.그것이 당신이하는 일이 아니라면 다른 함수 이름을 선택해야합니다. – crush

+0

나는 동의한다, 당신은 약간 overengineering 여기에서이다. 애플리케이션 디자인의이 단계에서 이러한 종류의 복잡성은 앞으로 도움이되지 않습니다. –

답변

2

이 질문을 올바르게 이해하고 싶습니다. 기본적으로 자체 예외를 적용하는 대신 채택 할 자연스러운 내부 예외가 있습니까?

또는 당신은 당신이 뭔가 할 수있는 인식하지 : 나는 점을 놓친 경우,

try 
{ 
    //some code to try 
    if (!in_array($type, $ascii_array)) { 
     throw new Exception('type not in ascii array'); 
    } 
} 
catch(Exception $e) { 
    die ('my custom exception message: ' . $e->getMessage()); 
} 

을 알려 내가 업데이트 할 수 있습니다.

자신의 예외를 포기하지 않는 이유는 ... 나는이 사실에 대한 실질적인 혜택을 알 수 없다. in_array()는 완벽하게 수용 가능하며 예외를 던지는 것은 개인적인 취향 일 수 있으며 반드시 성능에 대한 가치있는 관심 사항이 아닐 수 있습니다.

편집

내 대답과 질문을 고려하면,이 답변으로 인해 PHP가 자바가하는 같은 예외를 던질 함수를 선언하는 것을 허용하지 않는다는 의견에 결론을 가능성이 받아 들여졌다 주목할 만하다. 간단히 말해.

이 답변은 그 목적에 부합하는 것입니다. PHP가 예외를 throw하는 함수를 선언 할 수 있습니까? 아니, 기본적으로 아닙니다. 함수 내에서 예외를 직접 catch해야합니다.

+0

글쎄, 내가 자연적인 내부 예외 메커니즘을 사용하여 더 나은 방법이 있다고 가정했기 때문에, 내가 쓴 것처럼 수동으로 예외를 던지기를 원하지 않는다고 썼다. 이렇게하면 코드의 양이 줄어 듭니다. 하지만 그렇게 할 기회가 없다면 - 그럼, 조건을 검사하고 메소드의 코드에서 예외를 던지 겠어. –

+0

나는 더 신중하게 설명하려고 노력할 것이다. 나는'public static function isAscii ($ string, $ type, $ length = -1)처럼 OutOfRangeException을 던집니다. 자바처럼 코드를 작성하고 싶습니다. 이와 같은 것이 가능하다면 메소드의 코드에 추가 조건을 쓸 필요가 없습니다. PHP의 모든 가능성을 알지 못하기 때문에이 질문을 던졌습니다. 그게 가능하지 않다면 - 아무런 문제가 없습니다. –

+0

"더 나은 방법"은 관점의 문제 일 수 있다고 생각합니다. 필자가 아는 한, php에는 Java와 같은 함수를 정의 할 수있는 수단이 없으며, 다른 언어 일 뿐이니까요. 간결하게, 대답은 당신이 이것을 할 수없고 자기 정의에 의지해야한다는 "아니오"일 것입니다. 나는 이것에 대한 모든 권위를 끝내지는 못했지만 8 년 이상의 PHP와 수많은 프레임 워크, CMS 패키지 및 이것이 가능하다는 것을 전혀 모르는 코드를 채택했습니다. –