* @version 0.0.0
* @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2022 Ship-Simu Developer Team
* @license GNU GPL 3.0 or any newer version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
// The node's own exception handler
function shipsimu_exception_handler ($exceptionInstance) {
// Is it an object and a valid instance?
if ((is_object($exceptionInstance)) && ($exceptionInstance instanceof Exception)) {
// Init variable
$backTrace = '';
// Generate exception code
$exceptionCode = ($exceptionInstance instanceof FrameworkException ? $exceptionInstance->getHexCode() : '0x' . bin2hex($exceptionInstance->getCode()));
// Get all call levels from backtrace
foreach ($exceptionInstance->getTrace() as $idx => $traceArray) {
// Init argument string
$argsString = '';
// Arguments given?
if (isset($traceArray['args'])) {
// Convert arguments type into human-readable
foreach ($traceArray['args'] as $arg) {
$argsString .= ', ' . gettype($arg);
}
$argsString = substr($argsString, 2);
}
// Set missing file/line
if (!isset($traceArray['file'])) $traceArray['file'] = 'unknown';
if (!isset($traceArray['line'])) $traceArray['line'] = '0';
if (!isset($traceArray['class'])) $traceArray['class'] = 'UnknownObject';
if (!isset($traceArray['type'])) $traceArray['type'] = '->';
$backTrace .= sprintf("---------- Pos %d: ----------
Method : %s%s%s(%s)
----- Caller: -----
File : %s
Line : %d\n",
($idx + 1),
$traceArray['class'],
$traceArray['type'],
$traceArray['function'],
$argsString,
basename($traceArray['file']),
$traceArray['line']
);
}
// Construct the message
$message = sprintf("--------------------------------------------------------------------------------
Uncaught Exception : %s
--------------------------------------------------------------------------------
Message : %s
Code : %s
File : %s
Line : %d
--------------------------------------------------------------------------------
Backtrace:
--------------------------------------------------------------------------------
%s
--------------------------------------------------------------------------------\n",
trim(html_entity_decode(strip_tags(get_class($exceptionInstance)))),
trim(html_entity_decode(strip_tags($exceptionInstance->getMessage()))),
$exceptionCode,
$exceptionInstance->getFile(),
$exceptionInstance->getLine(),
trim($backTrace)
);
// Output the message
print($message);
// Exit with code
exit(hexdec($exceptionCode));
} elseif (is_object($exceptionInstance)) {
// Output more details
printf('exceptionInstance=%s', print_r($exceptionInstance, true));
exit(255);
} else {
/*
* Invalid exception instance detected! Do *only* throw exceptions that
* extends our own exception 'FrameworkException' to get such nice
* outputs like above.
*/
printf('exceptionInstance[]=%s is invalid! Please inform the shipsimu developer team.' . PHP_EOL, gettype($exceptionInstance));
exit(255);
}
}
// Error handler
function shipsimu_error_handler (int $errno, string $errstr, string $errfile, int $errline, array $errcontext) {
// Construct the message
$message = sprintf('File: %s, Line: %d, Code: %d, Message: %s',
basename($errfile),
$errline,
$errno,
$errstr
);
// Throw an exception here
throw new FatalErrorException($message, BaseFrameworkSystem::EXCEPTION_FATAL_ERROR);
}
// Assertion handler
function shipsimu_assert_handler (string $file, int $line, int $code) {
// Empty code?
if (empty($code)) {
$code = 'Unknown';
}
// Create message
$message = sprintf('File: %s, Line: %s, Code: %s',
basename($file),
$line,
$code
);
// Log assert
syslog(LOG_WARNING, $message);
// Throw an exception here
throw new AssertionException($message, BaseFrameworkSystem::EXCEPTION_ASSERTION_FAILED);
}
// Set error handler
//set_error_handler('shipsimu_error_handler');
// Set the new handler
set_exception_handler('shipsimu_exception_handler');
// Init assert handling
assert_options(ASSERT_ACTIVE , true);
assert_options(ASSERT_WARNING , true);
assert_options(ASSERT_BAIL , true);
assert_options(ASSERT_QUIET_EVAL, false);
assert_options(ASSERT_CALLBACK , 'shipsimu_assert_handler');