PHP前端开发

快速失败

百变鹏仔 1个月前 (12-14) #PHP
文章标签 快速

核心原则

故障发生后立即检测并报告,防止无效状态在系统中传播。

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()            );        }    }}

目的:

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');        }    }}

目的:

快速失败的好处

  1. 早期错误检测
  2. 更干净的调试
  3. 防止级联故障
  4. 维护数据完整性
  5. 提高系统可靠性

最佳实践

  1. 使用强类型声明
  2. 实施彻底的输入验证
  3. 抛出特定异常
  4. 在流程的早期进行验证
  5. 在开发中使用断言
  6. 实施正确的错误处理
  7. 适当记录失败

何时使用快速失败

  1. 输入验证
  2. 配置加载
  3. 资源初始化
  4. 外部服务电话
  5. 数据处理管道