未处理异常求助:Credit方法中金额校验抛出的异常无法解决
解决存入金额异常及代码优化方案
嘿,这个异常我熟,咱们先搞清楚为啥会触发它,再把代码里的小坑一起填上~
你遇到的"Creditd amount must be greater than 0"(对应中文“存入金额必须大于0”)异常,本质是代码里的校验逻辑在起作用——当你调用Credit方法传入的金额≤0时,就会抛出这个异常。不过你的代码还有几个潜在小问题,咱们一起解决:
一、先搞定异常触发的直接原因
要避免这个异常,很简单:调用Credit方法时,传入的金额必须是正数。举个正确的调用例子:
// 创建一个初始余额100的账户 Account myAccount = new Account(100); // 存入50,正常执行,余额会变成150 myAccount.Credit(50); // 下面这两种写法都会触发异常,千万别这么传: // myAccount.Credit(-20); // 传入负数 // myAccount.Credit(0); // 传入0
二、修复代码里的隐藏坑
你的Account类还有几个逻辑漏洞,不修复的话会导致其他问题:
构造函数没干活:当前的构造函数是空的,不管你传入多少初始余额,
_balance都会是默认的0。咱们可以复用Balance属性的校验逻辑来初始化:public Account(decimal balance) { Balance = balance; // 这里会自动检查初始余额是否为负,一举两得 }异常信息拼写错了:英文里的
Creditd应该是Credited,如果你想用中文提示的话,直接用你给的“存入金额必须大于0”更直观。用更规范的异常类型:.NET专门提供了
ArgumentOutOfRangeException来处理参数范围错误,比通用的Exception更专业,调试的时候也更容易定位问题:// 余额校验的异常改成这个 else throw new ArgumentOutOfRangeException(nameof(value), "余额不能为负数"); // 存入金额的异常改成这个 else throw new ArgumentOutOfRangeException(nameof(amount), "存入金额必须大于0");
修正后的完整代码
namespace _11_8 { class Account { private decimal _balance; public Account(decimal balance) { Balance = balance; // 初始化余额,复用校验逻辑 } public decimal Balance { get { return _balance; } set { if (value >= 0) _balance = value; else throw new ArgumentOutOfRangeException(nameof(value), "余额不能为负数"); } } public virtual void Credit(decimal amount) { if (amount > 0) Balance += amount; else throw new ArgumentOutOfRangeException(nameof(amount), "存入金额必须大于0"); } } }
这样改完之后,不仅不会再触发存入金额的异常(只要你传正数),还修复了初始余额不生效的问题,异常类型也更规范啦~
内容的提问来源于stack exchange,提问作者Alex Poelzing
相关产品推荐
相关产品推荐

