核心原则
故障发生后立即检测并报告,防止无效状态在系统中传播。
1. 输入验证
class userregistration { public function register(array $data): void { // validate all inputs immediately $this->validateemail($data['email']); $this->validatepassword($data['password']); $this->validateage($data['age']); // only proceed if all validations pass $this->createuser($data); } private function validateemail(string $email): void { if (!filter_var($email, filter_validate_email)) { throw new validationexception('invalid email format'); } if ($this->emailexists($email)) { throw new duplicateemailexception('email already registered'); } } }
目的:
- 防止无效数据进入系统
- 通过在复杂操作之前失败来节省资源
- 向用户提供清晰的错误消息
- 维护数据完整性
2. 配置加载
class appconfig { private array $config; public function __construct(string $configpath) { if (!file_exists($configpath)) { throw new configurationexception("config file not found: $configpath"); } $config = parse_ini_file($configpath, true); if ($config === false) { throw new configurationexception("invalid config file format"); } $this->validaterequiredsettings($config); $this->config = $config; } private function validaterequiredsettings(array $config): void { $required = ['database', 'api_key', 'environment']; foreach ($required as $key) { if (!isset($config[$key])) { throw new configurationexception("missing required config: $key"); } } } }
目的:
- 确保应用程序以有效配置启动
- 防止由于缺少设置而导致运行时错误
- 使配置问题立即可见
- 简化调试配置问题
3. 资源初始化
class databaseconnection { private pdo $connection; public function __construct(array $config) { try { $this->validatedatabaseconfig($config); $this->connection = new pdo( $this->builddsn($config), $config['username'], $config['password'], [pdo::attr_errmode => pdo::errmode_exception] ); } catch (pdoexception $e) { throw new databaseconnectionexception( "failed to connect to database: " . $e->getmessage() ); } } private function validatedatabaseconfig(array $config): void { $required = ['host', 'port', 'database', 'username', 'password']; foreach ($required as $param) { if (!isset($config[$param])) { throw new databaseconfigexception("missing $param in database config"); } } } }
目的:
- 确保资源正确初始化
- 防止应用程序使用无效资源运行
- 使资源问题在启动期间可见
- 避免由于无效资源导致的级联失败
4. 外部服务调用
class paymentgateway { public function processpayment(order $order): paymentresult { // validate api credentials if (!$this->validateapicredentials()) { throw new apiconfigurationexception('invalid api credentials'); } // validate order before external call if (!$order->isvalid()) { throw new invalidorderexception('invalid order state'); } try { $response = $this->apiclient->charge($order); if (!$response->issuccessful()) { throw new paymentfailedexception($response->geterror()); } return new paymentresult($response); } catch (apiexception $e) { throw new paymentprocessingexception( "payment processing failed: " . $e->getmessage() ); } } }
目的:
- 防止使用无效数据进行不必要的 api 调用
- 节省时间和资源
- 提供有关 api 问题的即时反馈
- 在外部服务交互期间保持系统可靠性
5. 数据处理管道
class DataProcessor { public function processBatch(array $records): array { $this->validateBatchSize($records); $results = []; foreach ($records as $index => $record) { try { $this->validateRecord($record); $results[] = $this->processRecord($record); } catch (ValidationException $e) { throw new BatchProcessingException( "Failed at record $index: " . $e->getMessage() ); } } return $results; } private function validateBatchSize(array $records): void { if (empty($records)) { throw new EmptyBatchException('Empty batch provided'); } if (count($records) > 1000) { throw new BatchSizeException('Batch size exceeds maximum limit'); } } }
目的:
- 确保整个处理过程中的数据一致性
- 防止部分处理无效数据
- 尽早发现数据问题
- 简化复杂管道中的错误跟踪
- 在转换过程中保持数据完整性
快速失败的好处
- 早期错误检测
- 更干净的调试
- 防止级联故障
- 维护数据完整性
- 提高系统可靠性
最佳实践
- 使用强类型声明
- 实施彻底的输入验证
- 抛出特定异常
- 在流程的早期进行验证
- 在开发中使用断言
- 实施正确的错误处理
- 适当记录失败
何时使用快速失败
- 输入验证
- 配置加载
- 资源初始化
- 外部服务电话
- 数据处理管道