关于 bitrix-result-and-errors
面向 Bitrix 开发者的结果与错误处理技能,说明何时返回 Result、何时抛出异常,并涵盖错误码、ORM 结果和控制器边界。
主要功能
- 01Result 与异常的使用规则
- 02稳定且可机器读取的错误码
- 03类型化结果模式
- 04ORM 结果处理指引
- 05控制器错误响应模式
- 06模块边界的异常处理
适用场景
- 01设计服务方法契约
- 02返回验证与业务错误
- 03处理失败的 ORM 操作
- 04将异常映射为控制器错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bxmaximum/ bitrix-framework-skills --skill bitrix-result-and-errors安装后在 Claude Code 中输入/bitrix-result-and-errors确认已加载。
详细介绍
结果与错误
基线:main 23.0+ · 已验证:main 26.800.0
契约
- 预期失败(验证失败、业务规则不符、未找到、无权限)→ 返回带有
Error的Result。 - 状态或契约异常(模块缺失、数据库不可用、配置错误、程序错误)→ 抛出异常。
- 一个方法,一种契约:始终返回
Result,或者返回值,并在特殊情况下抛出异常。绝不使用bool/null/-1/['error' => …]。
Bitrix\Main\Result
use Bitrix\Main\Error;
use Bitrix\Main\Result;
$result = new Result();
if ($title === '')
{
return $result->addError(new Error('Title required', 'BLOG_POST_TITLE_EMPTY', ['field' => 'title']));
}
return $result->setData(['id' => $id]);
isSuccess()、addError(Error)、addErrors(Error[])、getErrors()、getError()(第一个错误或null)、getErrorMessages()、getErrorCollection()、setData(array)、getData()。设置方法返回$this。setData()会静默丢弃SqlExpression值。
Error 和代码
new Error($message, $code = 0, $customData = null)。JSON 格式:{"message", "code", "customData"}。
- 错误代码应稳定且可供机器读取:由模块、实体和原因组成(
BLOG_POST_NOT_FOUND),并定义为常量。客户端应根据代码而非文本进行分支处理。 - 消息通过
Loc::getMessage('BLOG_ERROR_POST_TITLE_EMPTY')获取。 ErrorCollection:new ErrorCollection([$error])、setError()、add([...])、getErrorByCode('CODE')、可迭代、isEmpty()、toArray()。
类型化结果
为调用方提供 getter,而不是让他们使用 getData()['post']:
final class CreatePostResult extends \Bitrix\Main\Result
{
private ?Post $post = null;
public function setPost(Post $post): self
{
$this->post = $post;
return $this;
}
public function getPost(): ?Post
{
return $this->post;
}
}
ORM 结果(Bitrix\Main\ORM\Data\*)
AddResult:getId()、getPrimary()、getObject()。UpdateResult:getId()、getPrimary()、getAffectedRowsCount()。DeleteResult:没有自有方法(没有受影响行数)。Bitrix\Main\Entity\*Result是兼容性别名。请使用ORM\Data\*。- 如果失败的 ORM 结果中的错误无人读取(
isSuccess()/getErrors()),销毁时会触发E_USER_WARNING。务必检查并返回该结果,或将其中的错误复制到上层。
$add = PostTable::add(['TITLE' => $title]);
if (!$add->isSuccess())
{
return (new Result())->addErrors($add->getErrors());
}
$id = $add->getId();
其他结果类型
EventResult(SUCCESS、ERROR、UNDEFINED)是处理器的响应,不是服务结果:bitrix-events。ValidationResult(bitrix-validation)继承自Result:将其中的错误添加到服务结果中。
控制器
$this->addErrors($result->getErrors()); return null; 会生成 {"status":"error","data":null,"errors":[…]}。响应封装详情:bitrix-controllers。
在边界处处理异常
在模块/控制器边界处捕获异常,记录日志,并返回通用错误:
try
{
return $this->service->run($dto);
}
catch (\Bitrix\Main\SystemException $e)
{
$this->logger->error('Run failed', ['exception' => $e]);
return (new Result())->addError(new Error('Internal error', 'VENDOR_INTERNAL_ERROR'));
}
- 绝不能在不记录日志的情况下吞掉
\Throwable。 - 开发者错误(
InvalidArgumentException、LogicException、TypeError)和“不可能发生”的领域状态(例如货币类型中出现除以零)应继续作为异常处理。
评论
支持 Markdown