【发布时间】:2021-04-02 22:54:53
【问题描述】:
我创建了一个类 dubPrime,它接受一个必须是两位数的整数。如果它不是两位数,则程序应该抛出异常。但是,每当我尝试创建一个不是两位数的对象时,我的程序就会崩溃并输出“[ERROR] FATAL UNHANDLED EXCEPTION”。 *我使用了工厂设计模式,这样不符合标准的对象就不会被创建。
有没有办法避免这种情况,使我的程序不会崩溃?
private DubPrime(bool upArg, bool enabledArg, uint xArg){
x = xArg;
up = upArg;
enabled = enabledArg;
}
public static DubPrime GetDubPrime(bool upArg = true, bool enabledArg = true, uint xArg = lowerLimit){
//x must be double digit
if(xArg<lowerLimit || xArg>upperLimit)
throw new ArgumentException("x should be a double digit");
else{
return new DubPrime(upArg, enabledArg, xArg);
}
}
更新:每当我尝试添加 try/catch 块时,编译器都会说“并非所有代码路径都返回值”。有必要退货吗?我可以抛出一个异常而不让它返回一些东西吗?
public static DubPrime GetDubPrime(bool upArg = true, bool enabledArg = true, uint xArg = lowerLimit){
try{
if(xArg<lowerLimit || xArg>upperLimit)
throw new ArgumentException("x should be a double digit");
else{
return new DubPrime(upArg, enabledArg, xArg);
}
}
catch(Exception e){
Console.WriteLine(e.Message);
}
}
【问题讨论】:
-
这是抛出异常的代码,但捕获它的代码在哪里?
-
每当我尝试添加一个 try/catch 块时,它都需要我返回一些东西并且不会编译。 (更新问题)
-
@KevinKhong 通常你会在调用
GetDubPrime的函数中捕获异常。在GetDubPrime本身内部,您可以直接处理错误情况,例如使用if/else块。没有必要为了在几行之后捕获它而抛出异常。 -
如果你抛出一个异常并且没有捕获它,程序就会终止。所以,抓住异常。见重复。对于您的其他问题请在网站上搜索确切的错误消息。此处已彻底涵盖了该特定错误。如果在研究了错误之后您仍然无法弄清楚,请发布一个新问题,说明您做了哪些研究以及具体您无法弄清楚的内容。
-
另见stackoverflow.com/questions/505471/…。您可以编写遵循
Try...()模式的工厂方法,即返回bool值,并将成功结果存储在out参数中,而不是抛出异常。或者,如果您坚持抛出异常,工厂方法也无济于事;您不妨从该类型的构造函数中抛出异常,因为这同样可以防止返回无效对象。