typescript - Typescript 中处理错误的最佳实践
问题描述
由于我阅读了几篇关于错误处理的文章,我仍然想知道在值对象中的验证逻辑上抛出异常是否是不好的方法。例如,我在下面有这个类,它是值对象:
export class UserName {
private readonly value: string;
constructor(value: string) {
this.value = this.evaluateName(value);
}
private evaluateName(value: string): string {
value = value.trim();
if (value === "") {
throw new UserNameError("username is required!");
}
return value;
}
static userNameOf(name: string): UserName {
return new UserName(name);
}
public isValidName(): boolean {
if (!/^[a-zA-Z]+$/.test(this.value)) {
throw new UserNameError("user name should contain only letter");
}
return true;
}
}
那么,如果有最好的方法来处理错误而不是像我一样抛出错误呢?谢谢 :)
解决方案
使用值对象的好处之一是它们可以强制执行自己的不变量。遵循“始终有效”原则是一个好主意,这意味着实体、聚合根和值对象永远不会处于违反其不变量的状态。
因此,从值对象中抛出异常是没有问题的。实际上,在您的示例中,它应该更严格。您当前可以创建一个无法通过 isValidName() 测试的用户名值对象,因为在完成构建之前未对其进行检查。
我会重构这个:
export class UserName {
private readonly value: string;
constructor(value: string) {
trimmed: string;
trimmed = value.trim();
if (trimmed === "") {
throw new UserNameError("Username is required!.");
}
if (!/^[a-zA-Z]+$/.test(trimmed)) {
throw new UserNameError("user name should contain only letter");
}
this.value = trimmed;
}
static userNameOf(name: string): UserName {
return new UserName(name);
}
}
推荐阅读
- xamarin - [QueryProperty("Name", "name")] 在 Xamarin Shell 应用程序中的用途是什么?
- ios - 如何在 SwiftUI 中使用 URLSession 请求后呈现视图?
- sublimetext3 - 使用 Sublime Text 查找/替换向输入标签添加属性
- azure - 尝试向用户添加架构扩展时权限不足
- java - 如何解析字符串二十一点游戏结果
- python-3.x - 随机显示列表中的图像
- javascript - 函数的并行执行 | 不需要异步等待,因为不需要等待
- python - 使用 python pandas 找到两列之间的相关方程
- java - 代码错误“org.openqa.selenium.remote.DriverCommand.NEW_SESSION”
- c - 导出 C 中的任意符号