【问题标题】:How to handle exceptions: "ERROR] FATAL UNHANDLED EXCEPTION:" [duplicate]如何处理异常:“错误] FATAL UNHANDLED EXCEPTION:” [重复]
【发布时间】: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 参数中,而不是抛出异常。或者,如果您坚持抛出异常,工厂方法也无济于事;您不妨从该类型的构造函数中抛出异常,因为这同样可以防止返回无效对象。

标签: c# oop


【解决方案1】:

您需要在GetDubPrime 之外捕获您在其中放入的ArgumentException。如果没有捕获到异常,则程序退出。

类似:

(...)
try 
{
   x = GetDubPrime(...);
} 
catch(ArgumentException ex) 
{
  // bad data, do something
  Console.WriteLine(ex.Message);
  x = 0; // or whatever is necessary
}
(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2021-06-04
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2020-12-11
    • 2011-01-07
    相关资源
    最近更新 更多