경고 하나 받아볼 수 있을까요?
php 네이티브 함수에서 발생하는 경고를 포착하여 처리해야 합니다.
구체적으로는:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
DNS 쿼리가 실패하면 경고가 발생합니다.
try
/catch
경고도 예외가 아니기 때문에 작동하지 않습니다.
2가지 옵션이 있습니다.
set_error_handler
이지에있이이이(((((((((((((((((((((((((((((((((?) ; ;보고후'알겠습니다'/'알겠습니다.
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
"이행"은 기본적으로 하고, "기능 중이라는 트릭을 . 여기서도설명하겠습니다.그러면 다음에서도 설명되는 "기능이 정지된 상태" 트릭을 실행해야 합니다.
또는 요약하면:
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
'programing' 카테고리의 다른 글
JAVA_를 사용해야 합니다.홈 포인트는 JDK 또는 JRE? (0) | 2022.10.30 |
---|---|
이 SQL의 쿼리 성능 향상 (0) | 2022.10.30 |
MySQL/MariaDB에 저장 프로시저를 NULL 매개 변수 허용 안 함 (0) | 2022.10.30 |
PHP에서 현재 기능을 실행하는 코드 라인 및 파일을 가져오시겠습니까? (0) | 2022.10.30 |
다른 Ajax 내의 vue js가 데이터를 가져오지만 보기를 렌더링하지 않습니다. (0) | 2022.10.30 |