복붙노트

PHP에서 @ 연산자의 오류를 표시하지 않습니다. [닫힘]

PHP

PHP에서 @ 연산자의 오류를 표시하지 않습니다. [닫힘]

귀하의 의견으로는, 당신이 오류를 처리하는 반면 PHP에서 오류 / 경고를 억제하기 위해 @ 연산자를 사용하는 것이 유효합니까?

그렇다면 어떤 상황에서 이것을 사용할 수 있습니까?

코드 예제를 환영합니다.

편집 : 참고 사항. 오류보고 기능을 끄려는 것은 아니지만, 예를 들어, 일반적인 관행은

@fopen($file);

그리고 나서 나중에 확인하십시오 ...하지만 당신은 일을함으로써 @를 제거 할 수 있습니다.

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}

또는 유사합니다.

나는 질문을 짐작한다 - 다른 어떤 방법으로도 처리 될 수없는 에러를 억제하기 위해 @HAS가 사용되는 곳은 어디입니까?

해결법

  1. ==============================

    1.내가 오류를 억제하고 그것을 처리합니다. 그렇지 않으면 TOCTOU 문제 (Time-of-check, time-of-use. 예를 들어, file_exists가 true를 반환하지만 fopen 전에 파일이 삭제 될 수 있음)가있을 수 있습니다.

    내가 오류를 억제하고 그것을 처리합니다. 그렇지 않으면 TOCTOU 문제 (Time-of-check, time-of-use. 예를 들어, file_exists가 true를 반환하지만 fopen 전에 파일이 삭제 될 수 있음)가있을 수 있습니다.

    그러나 나는 오류를 억 누르지 않고 그냥 사라지게 할뿐입니다. 더 잘 보입니다.

  2. ==============================

    2.참고 : 첫째, 99 %의 PHP 개발자가 오류 억제 연산자 (나는 그 중 하나였습니다)를 사용한다는 사실을 알고 있습니다. 따라서이 문제에 동의하지 않는 PHP 개발자는 누구나 기대하고 있습니다.

    참고 : 첫째, 99 %의 PHP 개발자가 오류 억제 연산자 (나는 그 중 하나였습니다)를 사용한다는 사실을 알고 있습니다. 따라서이 문제에 동의하지 않는 PHP 개발자는 누구나 기대하고 있습니다.

    짧은 답변: 아니!

    더 정확한 답 : 나는 모든 것을 알지 못해서 모르지만, 지금까지는 좋은 해결책이었던 상황을 보지 못했습니다.

    왜 그렇게 나쁜지 : PHP를 사용한 약 7 년 동안 나는 오류 제거 연산자로 인한 끊임없는 디버깅 고통을 보았으며 어쩔 수없는 상황을 경험하지 못했습니다.

    문제는 오류를 표시하지 않는 코드가 현재보고있는 오류를 일으킬 수 있다는 것입니다. 그러나 억압 된 라인이 의존하는 코드 나 그것이 실행되는 환경을 변경할 때, 라인이 무시하려고했던 것과 완전히 다른 에러를 출력 할 가능성이 있습니다. 그러면 출력되지 않는 오류를 어떻게 추적합니까? 디버깅에 오신 것을 환영합니다!

    억압 된 오류로 인해 얼마나 많은 시간을 낭비했는지 알기까지 수년이 걸렸습니다. 대부분의 경우 (그러나 독점적 인 것은 아니지만) 이것은 개발자 환경에서 오류가없는 제 3 자 스크립트 / 응용 프로그램 / 라이브러리를 설치 한 후 였지만 PHP 또는 서버 구성의 차이 또는 일반적으로 오류를 즉시 출력하는 종속성 누락으로 인해 내 것이 아닙니다. 문제가 무엇인지 알려주지 만 dev가 마법을 추가 할 때는 @.

    대안 (상황과 원하는 결과에 따라 다름) : 알고있는 실제 오류를 처리하십시오. 따라서 코드 조각이 특정 오류를 유발할 경우 특정 상황에서 실행되지 않습니다. 그러나 나는이 부분을 얻었고 최종 사용자가 오류를보고 걱정하고있었습니다. 이것이 바로 내가 지금 다루고있는 것입니다.

    일반 오류의 경우 오류 처리기를 설정하여 사용자가 페이지를 볼 때 원하는 방식으로 출력되지만 최종 사용자에게 표시되지 않고 기록되므로 사용자가 트리거하는 오류를 알 수 있습니다.

    치명적 오류의 경우 php.ini에서 display_errors를 off로 설정하십시오 (오류 처리기가 여전히 트리거 됨). 그리고 오류 로깅을 활성화하십시오. 개발 서버는 물론 라이브 서버 (권장)를 사용하는 경우 개발 서버에서이 단계를 수행 할 필요가 없으므로 오류 로그 파일을 보지 않고도 치명적인 오류를 디버깅 할 수 있습니다. 종료 기능을 사용하여 오류 처리기에 많은 치명적인 오류를 보내는 트릭도 있습니다.

    요약하자면: 그것을 피하십시오. 그것에는 좋은 이유가있을 수 있습니다. 그러나 나는 아직 그것을 보지 못했습니다. 그래서 그날까지 (@) Error suppression operator가 악하다고 생각합니다.

    자세한 정보가 필요하면 PHP 매뉴얼의 오류 제어 연산자 페이지에서 내 의견을 읽을 수 있습니다.

  3. ==============================

    3.예 억제는 의미가 있습니다.

    예 억제는 의미가 있습니다.

    예를 들어, fopen () 명령은 파일을 열 수 없으면 FALSE를 반환합니다. 괜찮습니다. 그러나 PHP 경고 메시지도 생성됩니다. 종종 경고를 원하지 않으므로 스스로 거짓임을 확인합니다.

    실제로 PHP 매뉴얼은이 경우 @를 사용하도록 권장합니다!

  4. ==============================

    4.fopen ()과 같은 함수를 사용할 때 경고를 내 보내지 않으려면 오류를 억제하고 예외를 사용할 수 있습니다.

    fopen ()과 같은 함수를 사용할 때 경고를 내 보내지 않으려면 오류를 억제하고 예외를 사용할 수 있습니다.

    try {
        if (($fp = @fopen($filename, "r")) == false) {
            throw new Exception;
        } else {
            do_file_stuff();
        }
    } catch (Exception $e) {
        handle_exception();
    }
    
  5. ==============================

    5.오류 억제는 모든 조건을 처리 할 수 ​​있다는 것을 알지 못하는 한 피해야합니다.

    오류 억제는 모든 조건을 처리 할 수 ​​있다는 것을 알지 못하는 한 피해야합니다.

    이것은 처음 보는 것보다 훨씬 더 힘들 수 있습니다.

    당신이 정말로해야 할 일은 오류를보고하기 위해 페이지를 보는 사용자에게 의존 할 수 없기 때문에 PHP의 "error_log"를보고 방법으로 사용하는 것입니다. (또한 PHP에서 이러한 오류를 표시하지 않도록 설정해야합니다)

    그러면 적어도 시스템에서 모든 것이 잘못되어 가고 있다는 종합적인 보고서를 보게 될 것입니다.

    실제로 오류를 처리해야하는 경우 사용자 지정 오류 처리기를 만들 수 있습니다

    http://php.net/set-error-handler

    그런 다음 예외 (처리 할 수 ​​있음)를 보내고 이상한 오류를 관리에보고하는 데 필요한 작업을 수행 할 수 있습니다.

  6. ==============================

    6.나는 결코 자신이 '@'... 기간을 사용하는 것을 허용하지 않는다.

    나는 결코 자신이 '@'... 기간을 사용하는 것을 허용하지 않는다.

    코드에서 '@'의 사용법을 발견하면 사용 시점과 사용 된 함수 주위의 의사 블록에서 눈에 잘 띄도록 주석을 추가합니다. 나도 이런 종류의 오류 억제로 인해 "유령을 쫓는"디버깅에 물 렸으며, 다음 사람이 그것을 발견했을 때 사용법을 강조함으로써 더 쉽게 만들 수 있기를 바랍니다.

    네이티브 PHP 함수가 에러를 만나면 '@'를 던지기 위해 내 자신의 코드를 원하고 '@'가 가장 쉬운 방법 인 것처럼 보이는 경우, 대신에 동일한 결과를 얻는 다른 것을 선택하지만 (다시) 코드에서 눈에 띄게 분명하다.

    $orig = error_reporting(); // capture original error level
    error_reporting(0);        // suppress all errors
    $result = native_func();   // native_func() is expected to return FALSE when it errors
    error_reporting($orig);    // restore error reporting to its original level
    if (false === $result) { throw new Exception('native_func() failed'); }
    

    그것은 단지 다음과 같은 코드를 작성하는 것입니다.

    $result = @native_func();
    

    그러나 나는 나의 억압이 나를 따라 다니는 가난한 디버깅 영혼을 위해서 매우 이해할 필요가있다.

  7. ==============================

    7.대부분의 사람들은 오류 메시지의 의미를 이해하지 못합니다. 농담 아니야. 그들 중 대부분.

    대부분의 사람들은 오류 메시지의 의미를 이해하지 못합니다. 농담 아니야. 그들 중 대부분.

    그들은 오류 메시지가 모두 같다고 생각합니다. "뭔가 잘못되었습니다!" 그들은 그것을 읽는 것을 꺼려하지 않는다. 오류 메시지의 가장 중요한 부분인데, 그것이 제기 된 사실뿐만 아니라 의미입니다. 무엇이 잘못되었는지 말할 수 있습니다. 오류 메시지는 도움을위한 것입니다. "어떻게 숨길 수 있습니까?" 문제. 그것은 초보자 웹 프로그래밍 세계에서 가장 큰 오해 중 하나입니다.

    따라서, 오류 메시지를 재갈 마시지 않고, 말한 것을 읽어야합니다. 그것은 하나의 "파일을 찾을 수 없습니다"값을 가지고 있지 않습니다. 수천 가지 다른 오류가있을 수 있습니다 : 허가 거부, 저장 모드 제한, open_basedir 제한 etc.etc. 각각은 적절한 조치가 필요합니다. 그러나 당신이 개그를하면 당신은 결코 어떤 일이 일어 났는지 알 수 없을 것입니다!

    그것은 매우 큰 차이가 있지만 OP는 오류 처리와 함께 오류보고를 엉망으로 만들고 있습니다! 오류 처리는 사용자를위한 것입니다. "무언가 일어났다"는 여기에 충분하다. 에러보고는 프로그래머를위한 것이지, 필사적으로 무슨 일이 있었는지 필사적으로 알아야합니다.

    따라서 결코 오류 메시지를 개그하지 마십시오. 둘 다 프로그래머 용으로 기록하고 사용자를 위해 처리합니다.

  8. ==============================

    8.php.ini 경고 및 오류를 억제 할 수있는 방법이 없습니까? 이 경우 플래그 변경 만 디버깅하고 어떤 @가 문제를 숨기고 있는지 발견하지 못하게 할 수 있습니다.

    php.ini 경고 및 오류를 억제 할 수있는 방법이 없습니까? 이 경우 플래그 변경 만 디버깅하고 어떤 @가 문제를 숨기고 있는지 발견하지 못하게 할 수 있습니다.

  9. ==============================

    9.@를 사용하면 때로는 생산성이 떨어집니다. 필자의 경험에 따르면, php.ini 나 call에서 항상 에러보고를 꺼야한다.

    @를 사용하면 때로는 생산성이 떨어집니다. 필자의 경험에 따르면, php.ini 나 call에서 항상 에러보고를 꺼야한다.

    error_reporting(0);
    

    생산 현장에서. 이렇게하면 개발 중에 라인을 주석 처리하고 디버깅을 위해 오류를 볼 수 있습니다.

  10. ==============================

    10.필자가 실제로 사용해야 할 곳은 eval 함수 뿐이다. eval은 구문 오류로 인해 문자열을 파싱 할 수없는 경우 eval이 false를 반환하지 않고 일반 스크립트에서 구문 분석 오류가 발생하는 것처럼 오류를 throw합니다. 문자열에 저장된 스크립트가 구문 분석 가능한지 여부를 확인하려면 다음과 같이 사용할 수 있습니다.

    필자가 실제로 사용해야 할 곳은 eval 함수 뿐이다. eval은 구문 오류로 인해 문자열을 파싱 할 수없는 경우 eval이 false를 반환하지 않고 일반 스크립트에서 구문 분석 오류가 발생하는 것처럼 오류를 throw합니다. 문자열에 저장된 스크립트가 구문 분석 가능한지 여부를 확인하려면 다음과 같이 사용할 수 있습니다.

    $script_ok = @eval('return true; '.$script);
    

    AFAIK, 이것이 가장 우아한 방법입니다.

  11. ==============================

    11.내가 사용하는 곳은 소켓 코드이다. 예를 들어 타임 아웃을 설정했다면 @를 포함하지 않는다면 패킷을 얻지 않아도 경고 메시지를 볼 수있다.

    내가 사용하는 곳은 소켓 코드이다. 예를 들어 타임 아웃을 설정했다면 @를 포함하지 않는다면 패킷을 얻지 않아도 경고 메시지를 볼 수있다.

    $data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )
    
  12. ==============================

    12.스크립트가 느려지므로 모든 것을 억제하고 싶지는 않습니다.

    스크립트가 느려지므로 모든 것을 억제하고 싶지는 않습니다.

    네, php.ini와 스크립트에서 오류를 제거하는 방법이 있습니다 (단, 실제 환경에서 PHP로 오류를 기록 할 때만 수행하십시오)

    <?php
        error_reporting(0);
    ?>
    

    그리고 이것을 끄는 php.ini 버전에서 이것을 읽을 수 있습니다.

  13. ==============================

    13.사용자 지정 오류 처리 함수를 사용하고 오류 (아마도 알려진 오류)를 표시하려면이 메서드를 사용하십시오. 오류 처리기가 설정된 경우 오류를 표시하지 않으므로 '@'의 사용은이 컨텍스트에서는 좋지 않습니다.

    사용자 지정 오류 처리 함수를 사용하고 오류 (아마도 알려진 오류)를 표시하려면이 메서드를 사용하십시오. 오류 처리기가 설정된 경우 오류를 표시하지 않으므로 '@'의 사용은이 컨텍스트에서는 좋지 않습니다.

    3 개의 함수를 작성하고 이와 같이 호출하십시오.

    # supress error for this statement
    supress_error_start();  
    $mail_sent = mail($EmailTo, $Subject, $message,$headers);
    supress_error_end(); #Don't forgot to call this to restore error.  
    
    function supress_error_start(){
        set_error_handler('nothing');
        error_reporting(0);
    }
    
    function supress_error_end(){
        set_error_handler('my_err_handler');
        error_reporting('Set this to a value of your choice');
    }
    
    function nothing(){ #Empty function
    }
    
    function my_err_handler('arguments will come here'){
          //Your own error handling routines will come here
    }
    
  14. ==============================

    14.DOMDocument 객체로 처리하기 위해 HTML 파일을로드하려고 할 때 사용합니다. HTML에 문제가있는 경우 ... 적어도 하나는없는 웹 사이트 ... DOMDocument-> loadHTMLFile ()을 사용하면 @를 사용하지 않으면 오류가 발생합니다. 이것은 PHP에서 HTML 스크래퍼를 만드는 데 성공한 유일한 방법입니다 (아마도 더 좋은 방법 일 것입니다).

    DOMDocument 객체로 처리하기 위해 HTML 파일을로드하려고 할 때 사용합니다. HTML에 문제가있는 경우 ... 적어도 하나는없는 웹 사이트 ... DOMDocument-> loadHTMLFile ()을 사용하면 @를 사용하지 않으면 오류가 발생합니다. 이것은 PHP에서 HTML 스크래퍼를 만드는 데 성공한 유일한 방법입니다 (아마도 더 좋은 방법 일 것입니다).

  15. from https://stackoverflow.com/questions/136899/suppress-error-with-operator-in-php by cc-by-sa and MIT license

'PHP' 카테고리의 다른 글

PHP에서 연관 배열 정렬 [duplicate]  (0) 2018.09.12
주어진 날짜와 오늘 비교  (0) 2018.09.12
url 매개 변수로 배열 전달하기  (0) 2018.09.12
PHP 5의 호출자 함수?  (0) 2018.09.12
foreach 루프의 두 배열  (0) 2018.09.12