将告别 throw exception!为什么 Result 这句话可能是在讨论编程中异常处理和返回结果(Result)的概念。1. **将告别 throw exception**:这里的throw exception指的是在编程中抛出异常(Excepti
摘要:引言:一个普遍存在的“坏味道” 如果你在C#项目中看到这样的代码,一定不会感到陌生: public User Login(string username, string password) { var user = FindUser(use
引言:一个普遍存在的“坏味道”
如果你在C#项目中看到这样的代码,一定不会感到陌生:
public User Login(string username, string password)
{
var user = FindUser(username);
if (user == null)
throw new Exception("用户不存在"); // ❌ 熟悉的模式
if (!VerifyPassword(user, password))
throw new Exception("密码错误"); // ❌ 另一个熟悉的模式
return user;
}
这种使用异常来处理业务逻辑的做法,几乎成了C#开发的“标准范式”。
可是,从来如此,便是对的么?
一、异常的“原罪” —— 我们一直在滥用它
1.1 异常的本质是什么?
首先,我们要明白C#语言里的异常(Exception)的设计初衷:
// 这些才是异常真正的使用场景:
public void ReadFile(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentNullException(nameof(path)); // ✅ 参数检查
if (!File.Exists(path))
throw new FileNotFoundException($"文件不存在: {path}"); // ✅ 系统错误
// 尝试读取文件,可能抛出IOException等
var content = File.ReadAllText(path);
}
异常是为真正的"异常情况"设计的,比如:
系统资源不可用(文件不存在、数据库连接失败)
程序状态异常(空指针、数组越界)
参数验证失败(前置条件不满足)
1.2 业务逻辑 ≠ 异常情况
业务错误(用户不存在、密码错误、余额不足)是可预见的正常业务流程,而不是异常情况。
