从枚举中获取异常
本文关键字:异常 获取 枚举 | 更新日期: 2023-09-27 18:07:14
我收到了一个错误日志,显示以下代码在set
中抛出了异常 public double Value {
get {
switch (DefinedUnits.Distance) {
case DistanceUnits.Feet: { return Feet; }
case DistanceUnits.Meters: { return Meters; }
case DistanceUnits.NM: { return NauticalMiles; }
default: { throw new Exception("Invalid Distance Unit Specified"); }
}
}
set {
switch (DefinedUnits.Distance) {
case DistanceUnits.Feet: { Feet = value; break; }
case DistanceUnits.Meters: { Meters = value; break; }
case DistanceUnits.NM: { NauticalMiles = value; break; }
default: { throw new Exception("Invalid Distance Unit Specified"); }
}
}
}
DefinedUnits。Distance是一个enum:
public enum DistanceUnits {
Meters,
Feet,
NM
}
我无法在我的代码中看到可以发送其他内容。我没有任何地方可以将此enum视为整数,从而可以传入错误的值。用户不能告诉我他在做什么。或者更确切地说,他告诉我他在做一些不可能叫这个的事情。
是否有一个合理的解释为什么会发生这种情况,我该如何阻止它?
谢谢
也许这个值是在它被设置之前获取的,留下一个无效的默认值?(不可否认,如果你没有设置任何相应的整数,Meters
应该对应于0…)您应该将代码调整为:
- 抛出更具体的异常(例如
InvalidOperationException
) - 在异常消息 中包含该值
如果你有堆栈跟踪,你至少应该能够看到是getter还是setter抛出了异常…
DefinedUnits。Distance要么为空,要么初始化为超出范围的值。
改变你的默认处理程序应该给你一个提示:
default: { throw new Exception("Invalid Distance Unit Specified: " + DefinedUnits.Distance != null ? DefinedUnits.Distance.ToString() : '**null**' ); }
打印到日志异常。StackTrace和(int)DefinedUnits。距离值获取更多信息
如果您使用Dotfuscator(或其他混淆软件)并将字符串值(例如"Feet")转换为enum,则有可能混淆了enum名称,并且字符串到enum的转换失败。