programing

경고 하나 받아볼 수 있을까요?

procenter 2022. 10. 30. 16:22
반응형

경고 하나 받아볼 수 있을까요?

php 네이티브 함수에서 발생하는 경고를 포착하여 처리해야 합니다.

구체적으로는:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

DNS 쿼리가 실패하면 경고가 발생합니다.

try/catch경고도 예외가 아니기 때문에 작동하지 않습니다.

2가지 옵션이 있습니다.

  1. set_error_handler이지에있이이이(((((((((((((((((((((((((((((((((?) ; ;

  2. 보고후'알겠습니다'/'알겠습니다.false호스트명의 레코드는 발견되지 않았습니다.

여기서의 베스트 프랙티스는 무엇입니까?

오류 핸들러 설정 및 복원

하고, 를 「」로 도 생각할 수 .restore_error_handler().

set_error_handler(function() { /* ignore errors */ });
dns_get_record();
restore_error_handler();

이 아이디어를 바탕으로 오류를 기록하는 재사용 가능한 오류 핸들러를 작성할 수 있습니다.

set_error_handler([$logger, 'onSilencedError']);
dns_get_record();
restore_error_handler();

오류를 예외로 변환

하시면 됩니다.set_error_handler()ErrorException: 합니다.class: 오 php php 、 class class class class class class 。

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }
    
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    dns_get_record();
} catch (ErrorException $e) {
    // ...
}

때은 에러 가 에러 핸들러를 입니다.error_reporting모든 오류(오류, 경고 등)를 설정하여 오류 핸들러에 전달합니다.을 때 설정할 수 .set_error_handler() 을 사용합니다.... = error_reporting()에러 핸들러내에 있습니다.

경고 억제

@하고 @의 .dns_get_record()나중에.그러나 오류/경고는 억제되지 않고 처리되어야 하기 때문에 이에 대해 반대합니다.

를 「에러 핸들러」로 입니다.E_WARNING다음과 같이 합니다.

set_error_handler("warning_handler", E_WARNING);
dns_get_record(...)
restore_error_handler();

function warning_handler($errno, $errstr) { 
// do something
}

경고는 억제되지만 치명적인 오류도 억제되므로 작업자와 함께 주의하시기 바랍니다.나는 누군가가 쓴 시스템의 문제를 디버깅하는 데 많은 시간을 할애했다.@mysql_query( '...' )문제는 mysql 지원이 PHP에 로드되지 않아 사일런트 에러가 발생했다는 것입니다.PHP 코어의 일부인 것은 안전합니다만, 조심해서 사용해 주세요.

bob@mypc:~$ php -a
Interactive shell

php > echo @something(); // this will just silently die...

더 이상 출력 없음 - 디버깅에 성공하십시오!

bob@mypc:~$ php -a
Interactive shell

php > echo something(); // lets try it again but don't suppress the error
PHP Fatal error:  Call to undefined function something() in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
bob@mypc:~$ 

이번에는 왜 실패했는지 알 수 있다.

시도 로깅 "/"/"에 있음)을 합니다./var/log/apache2/error.log가 반환할 가 있다).; """ """false"이행"은 기본적으로 하고, "기능이라는 트릭을 . 여기서도설명하겠습니다.그러면 다음에서도 설명되는 "기능이 정지된 상태" 트릭을 실행해야 합니다.

php에서 예외를 발생시키는 정적 방법이 있습니까?

또는 요약하면:

  function throwErrorException($errstr = null,$code = null, $errno = null, $errfile = null, $errline = null) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) {
    return false && throwErrorException($errstr, 0, $errno, $errfile, $errline);
    # error_log("AAA"); # will never run after throw
    /* Do execute PHP internal error handler */
    # return false; # will never run after throw
  }
  ...
  set_error_handler('warning_handler', E_WARNING);
  ...
  try {
    mkdir($path, 0777, true);
  } catch (Exception $e) {
    echo $e->getMessage();
    // ...
  }

하지 않는 되었습니다.「 집 : 집 : 세히 살살 edit "return false && throwErrorException ...기본적으로 "는 예외를 발생시키지 않고 오류 로그만 기록하고 "를 삭제합니다.false && 」와 , 「 의 부분.return throwErrorException ...error_log 라고 합니다.하지만 다른 곳에서는 이 행동을 문서화한 적이 없기 때문에 계속 보고할 것입니다.

하여 「」를 으로 합니다.file_get_contents()외부 URL 호출을 통해 다음과 같은 경고를 처리할 수 있습니다. 연결 시간 초과"가 훨씬 나았습니다.

set_error_handler(function ($err_severity, $err_msg, $err_file, $err_line, array $err_context)
{
    throw new ErrorException( $err_msg, 0, $err_severity, $err_file, $err_line );
}, E_WARNING);
try {
    $iResult = file_get_contents($sUrl);
} catch (Exception $e) {
    $this->sErrorMsg = $e->getMessage();
}
restore_error_handler();

이 솔루션은 오브젝트 컨텍스트에서도 동작합니다.다음 함수로 사용할 수 있습니다.

public function myContentGetter($sUrl)
{
  ... code above ...
  return $iResult;
}

통상, 이것이 유일한 해결 방법이 아닌 한, @ 를 사용하지 말아 주세요.이 경우 먼저 dns_check_record 함수를 사용하여 레코드가 존재하는지 여부를 확인해야 합니다.

경고를 완전히 삭제하려고 시도해야 합니다만, 그럴 수 없는 경우는, 콜의 선두에 @(@dns_get_record(...))를 붙여 경고 발생 여부를 확인할 수 있는 정보를 사용할 수 있습니다.

ifdns_get_record()됩니다.FALSE는 '로 경고를 할 수 있습니다.@반환값을 확인합니다.

부울 값이 반환되는지 여부를 확인한 후 조건으로서 사용할 수 있습니다.oci_execute(...)에서 이 문제가 발생했습니다.그것은, 고유의 키로 위반을 반환하고 있었습니다.

ex.
oci_parse($res, "[oracle pl/sql]");
if(oci_execute){
...do something
}

PHP8에서는 오류 및 경고를 감지하도록 오류 핸들러를 설정하는 대신 다음을 수행할 수 있습니다.저는 PHP 7을 믿습니다.오류를 발견할 수 있습니다.

try {
    call_user_func('sprintf', array_merge([$string], $args));
} catch (Throwable $e) {
    $logger->info('mesage...');
}

이러한 방법으로 벌크헤드를 실시하면 로거를 전달하거나 액세스할 수 있습니다.이는 잘못된 파라미터를 메서드에 전달하는 등 코더 오류를 혼란스럽게 하거나 기타 다양한 문제를 숨길 수 있기 때문입니다.

https://syslog.watch/syslog/8.0/internal-function-예외

통지가 잡힐지 어떨지 모르겠지만(아마 없을 것 같습니다), 무엇을 하고 싶은지 조금 더 생각해 보면, 이러한 예에 대해 해결할 수 있을 것입니다.

빌더 패턴과 옵션 패턴은 둘 다 콜 사이트 이전(프라이빗 함수 또는 유효성 검사 직후) 또는 코드에만 기인하는 실제 커스텀 예외를 발생시킬 수 있는 해결 방법을 제공합니다.이것에 의해, 빌트인 기능도 매우 안전하게 사용할 수 있게 됩니다.

, 하다, 하다, 하다, 하다, 하다, 하다, .debug_backtrace, 를 사용하여, 를 참조해 주세요.DEBUG_BACKTRACE_IGNORE_ARGS '어느 정도'를 쓰거나요.getTrace ★★★★★★★★★★★★★★★★★」getTraceAsString일부 콘텍스트가 미리 선택되도록 Throwable에 메서드를 추가합니다.

폴더 구조

index.php //Script File
logs //Folder for log Every warning and Errors
CustomException.php //Custom exception File

Custom Exception(커스텀 예외)php

/**
* Custom error handler
*/
function handleError($code, $description, $file = null, $line = null, $context = null) {
    $displayErrors = ini_get("display_errors");;
    $displayErrors = strtolower($displayErrors);
    if (error_reporting() === 0 || $displayErrors === "on") {
        return false;
    }
    list($error, $log) = mapErrorCode($code);
    $data = array(
        'timestamp' => date("Y-m-d H:i:s:u", time()),
        'level' => $log,
        'code' => $code,
        'type' => $error,
        'description' => $description,
        'file' => $file,
        'line' => $line,
        'context' => $context,
        'path' => $file,
        'message' => $error . ' (' . $code . '): ' . $description . ' in [' . $file . ', line ' . $line . ']'
    );
    $data = array_map('htmlentities',$data);
    return fileLog(json_encode($data));
}

/**
* This method is used to write data in file
* @param mixed $logData
* @param string $fileName
* @return boolean
*/
function fileLog($logData, $fileName = ERROR_LOG_FILE) {
    $fh = fopen($fileName, 'a+');
    if (is_array($logData)) {
        $logData = print_r($logData, 1);
    }
    $status = fwrite($fh, $logData . "\n");
    fclose($fh);
//    $file = file_get_contents($filename);
//    $content = '[' . $file .']';
//    file_put_contents($content); 
    return ($status) ? true : false;
}

/**
* Map an error code into an Error word, and log location.
*
* @param int $code Error code to map
* @return array Array of error word, and log location.
*/
function mapErrorCode($code) {
    $error = $log = null;
    switch ($code) {
        case E_PARSE:
        case E_ERROR:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            $error = 'Fatal Error';
            $log = LOG_ERR;
            break;
        case E_WARNING:
        case E_USER_WARNING:
        case E_COMPILE_WARNING:
        case E_RECOVERABLE_ERROR:
            $error = 'Warning';
            $log = LOG_WARNING;
            break;
        case E_NOTICE:
        case E_USER_NOTICE:
            $error = 'Notice';
            $log = LOG_NOTICE;
            break;
        case E_STRICT:
            $error = 'Strict';
            $log = LOG_NOTICE;
            break;
        case E_DEPRECATED:
        case E_USER_DEPRECATED:
            $error = 'Deprecated';
            $log = LOG_NOTICE;
            break;
        default :
            break;
    }
    return array($error, $log);
}
//calling custom error handler
set_error_handler("handleError");

위와 같은 파일을 스크립트 파일에 포함시키면 됩니다.

index.displaces를 표시합니다.

error_reporting(E_ALL);
ini_set('display_errors', 'off');
define('ERROR_LOG_FILE', 'logs/app_errors.log');

include_once 'CustomException.php';
echo $a; // here undefined variable warning will be logged into logs/app_errors.log

PHP7에서는 대부분의 오류와 경고를 다음과 같이 검출할 수 있습니다.

try {
    whatever();
} catch (Throwable $e) {
}

상세: https://www.php.net/manual/en/language.errors.php7.php

@를 사용하여 직접 작업(예: $prop = @($high/($width - $depth)), 경고 0으로 나누기를 건너뛰는 경우에만 경고를 억제할 것을 권장합니다.그러나 대부분의 경우 처리하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/1241728/can-i-try-catch-a-warning

반응형