getErrorCode()->value . " (" . $exception->getErrorCode()->getDescription() . ")\n"; echo "Message: " . $exception->getMessage() . "\n"; echo "Operation: " . $exception->getContext()->operation . "\n"; echo "Component: " . $exception->getContext()->component . "\n"; echo "Template: " . $exception->getContext()->data['template'] . "\n"; echo "Suggestions: " . json_encode($exception->getContext()->metadata['suggestions']) . "\n"; echo "Template Type: " . $exception->getContext()->metadata['template_type'] . "\n\n"; // Test 2: TemplateCacheException echo "πŸ” Test 2: TemplateCacheException Error Codes\n"; echo "-" . str_repeat("-", 45) . "\n"; $cacheException = TemplateCacheException::cacheWriteFailed( 'template_user_profile_123', '/tmp/cache/templates/user_profile_123.cache' ); echo "Exception Class: " . get_class($cacheException) . "\n"; echo "Error Code: " . $cacheException->getErrorCode()->value . "\n"; echo "Description: " . $cacheException->getErrorCode()->getDescription() . "\n"; echo "Recovery Hint: " . $cacheException->getErrorCode()->getRecoveryHint() . "\n"; echo "Is Recoverable: " . ($cacheException->getErrorCode()->isRecoverable() ? 'Yes' : 'No') . "\n"; echo "Retry After: " . ($cacheException->getErrorCode()->getRetryAfterSeconds() ?? 'N/A') . " seconds\n"; echo "Recovery Strategy: " . $cacheException->getContext()->metadata['recovery_strategy'] . "\n\n"; // Test 3: TemplateRenderingException Variable Resolution echo "πŸ” Test 3: TemplateRenderingException Variable Resolution\n"; echo "-" . str_repeat("-", 45) . "\n"; $renderingException = TemplateRenderingException::variableNotFound( 'user/dashboard', 'userName', ['user' => ['id' => 1], 'userProfile' => ['name' => 'John'], 'userSettings' => []] ); echo "Exception Class: " . get_class($renderingException) . "\n"; echo "Error Code: " . $renderingException->getErrorCode()->value . "\n"; echo "Missing Variable: " . $renderingException->getContext()->data['missing_variable'] . "\n"; echo "Available Variables: " . json_encode($renderingException->getContext()->data['available_variables']) . "\n"; echo "Suggestions: " . json_encode($renderingException->getContext()->metadata['suggestions']) . "\n\n"; // Test 4: TemplateProcessorException Chain Failure echo "πŸ” Test 4: TemplateProcessorException Chain Failure\n"; echo "-" . str_repeat("-", 45) . "\n"; $processorException = TemplateProcessorException::processorChainFailed( ['AssetInjector', 'FormProcessor', 'LayoutProcessor', 'ComponentProcessor'], 'FormProcessor' ); echo "Exception Class: " . get_class($processorException) . "\n"; echo "Error Code: " . $processorException->getErrorCode()->value . "\n"; echo "Failed Processor: " . $processorException->getContext()->data['failed_processor'] . "\n"; echo "Chain Position: " . $processorException->getContext()->data['chain_position'] . "\n"; echo "Recovery Strategy: " . $processorException->getContext()->metadata['recovery_strategy'] . "\n\n"; // Test 5: ErrorCode Template Categories echo "πŸ” Test 5: ErrorCode Template Categories\n"; echo "-" . str_repeat("-", 45) . "\n"; $templateErrorCodes = [ ErrorCode::TPL_TEMPLATE_NOT_FOUND, ErrorCode::TPL_SYNTAX_ERROR, ErrorCode::TPL_VARIABLE_NOT_FOUND, ErrorCode::TPL_COMPILATION_FAILED, ErrorCode::TPL_RENDERING_FAILED, ErrorCode::TPL_CACHE_FAILED, ErrorCode::TPL_CONTENT_LOADING_FAILED, ErrorCode::TPL_PROCESSOR_FAILED, ErrorCode::TPL_ASSET_NOT_FOUND, ErrorCode::TPL_INVALID_TEMPLATE_TYPE, ]; foreach ($templateErrorCodes as $errorCode) { $category = $errorCode->getCategory(); $isRecoverable = $errorCode->isRecoverable() ? 'Yes' : 'No'; $retryAfter = $errorCode->getRetryAfterSeconds() ?? 'N/A'; echo " {$errorCode->value}: {$errorCode->getDescription()}\n"; echo " Category: $category | Recoverable: $isRecoverable | Retry: $retryAfter\n"; } echo "\n"; // Test 6: Framework Exception Hierarchy Compliance echo "πŸ” Test 6: Framework Exception Hierarchy Compliance\n"; echo "-" . str_repeat("-", 45) . "\n"; $exceptions = [ 'TemplateNotFoundException' => TemplateNotFoundException::forTemplate('test'), 'TemplateCacheException' => TemplateCacheException::cacheReadFailed('test', '/tmp/test'), 'TemplateRenderingException' => TemplateRenderingException::renderingFailed('test', 'processing'), 'TemplateProcessorException' => TemplateProcessorException::processorFailed('TestProcessor', 'test', 'operation'), ]; foreach ($exceptions as $name => $exception) { $isFrameworkException = $exception instanceof FrameworkException; $hasErrorCode = $exception->getErrorCode() !== null; $hasContext = $exception->getContext() !== null; $isFinal = (new ReflectionClass($exception))->isFinal(); echo " $name:\n"; echo " βœ… Framework Exception: " . ($isFrameworkException ? 'Yes' : 'No') . "\n"; echo " βœ… Has ErrorCode: " . ($hasErrorCode ? 'Yes' : 'No') . "\n"; echo " βœ… Has Context: " . ($hasContext ? 'Yes' : 'No') . "\n"; echo " βœ… Is Final: " . ($isFinal ? 'Yes' : 'No') . "\n"; } echo "\nπŸŽ‰ All Template Exception Handling Tests completed successfully!\n\n"; echo "πŸ“‹ Summary of Framework Integration:\n"; echo " βœ… Modern FrameworkException mit ErrorCode Integration\n"; echo " βœ… Rich Exception Context mit Operation/Component Tracking\n"; echo " βœ… Factory Methods fΓΌr konsistente Exception Creation\n"; echo " βœ… Recovery Hints und Retry Strategies\n"; echo " βœ… Template-spezifische Error Codes (TPL001-TPL010)\n"; echo " βœ… Intelligent Error Suggestions und Metadata\n"; echo " βœ… Framework-konforme final readonly Classes\n"; echo " βœ… Backward Compatible Legacy Support\n"; } catch (Exception $e) { echo "❌ Test failed with error: " . $e->getMessage() . "\n"; echo "Exception: " . get_class($e) . "\n"; echo "Stack trace:\n" . $e->getTraceAsString() . "\n"; exit(1); }