You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未处理异常求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:17:39