throw new OwnExceptionClass 让程序崩溃

Posted

技术标签:

【中文标题】throw new OwnExceptionClass 让程序崩溃【英文标题】:throw new OwnExceptionClass lets program crash 【发布时间】:2016-01-22 18:37:20 【问题描述】:

我有一个函数,代码如下:

if (!File::exists(i_filename)) throw new FileNotFoundException(i_filename);

我的 FileNotFoundException 看起来像这样 .h

#pragma once

#include <exception>
#include <string>

class FileNotFoundException : public std::exception 
public:
    FileNotFoundException(const std::string &i_filename);
private:
    std::string m_filename;
;

.cpp

#include "FileNotFoundException.h"

FileNotFoundException::FileNotFoundException(const std::string & i_filename) 
    m_filename = i_filename;
    // A message will be pushed to console & debug window, I first wanted to test

但 Visual Studio 告诉我 Unhandled Exception at 0x7432D8A8 in 2D Game.exe: Microsoft C++ Exception: FileNotFoundException at storage location 0x0018F5FC. 当我运行throw new FileNotFoundException(i_filename);

有谁知道怎么回事?抱歉,我之前从未创建过异常类。

【问题讨论】:

您使用的 try catch 块在哪里? 是的。如果你抛出一个异常,它必须在某个地方被捕获。否则你会得到你所得到的。 呃?你认为抛出异常到底有什么作用? @user3874443 您可能想了解异常的目的 顺便说一句,不会动态分配异常。这不是Java。只需写throw FileNotFoundException()(纠正拼写后!) 【参考方案1】:

正如 cmets 已经展示的那样,您需要一个 try-catch 块来捕获异常。否则你将无法告诉编译器应该发生什么,什么时候抛出异常。

顺便说一句,在 C++ 中抛出指针是个坏主意,因为在 catch 块中匹配的类型可能与预期不同。改为抛出一个值并捕获对它的引用:

if (!File::exists(i_filename))
    throw FileNotFountExceptioni_filename;

// .... somewhere else

try 
  // call the above function
 catch(FileNotFountException& e) 
  // handle the exception here

除了您的实际问题:最好优先选择初始化列表而不是在构造函数中分配值:

class FileNotFountException : public std::exception 
    public:
        FileNotFountException(const std::string &i_filename): 
            m_filenamei_filename ;
    private:
        std::string m_filename;
;

这将使用i_filename 的副本初始化m_filename,而您的实现将使用空字符串初始化m_filename,然后复制i_filename 的内容。

如果你的构造函数很简单,你应该更喜欢直接在头文件的声明中定义。它将像声明为inline 的函数一样编译。

【讨论】:

好吧,我慢慢地但肯定地理解了如何使用异常......以及在 catch 块中做什么?你写了“在这里处理异常”,但我会在 Exception 类中做所有事情。 不,这不是一个好地方。如果从未出现异常,编译器可能会采取一些捷径并排除您的假设。当它可以证明它在任何情况下都不会被咳嗽时,它甚至可以剥离代码来调用异常类的构造函数。只需按原样使用它们,它们就该被使用,您就不会受到意外的伤害。 好的,谢谢。我将仔细研究异常。

以上是关于throw new OwnExceptionClass 让程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在catch块中throw new Exception的意义(转)

throw new OwnExceptionClass 让程序崩溃

throw new TypeError('“继承”的超级构造函数不能 ' +

throw new TypeError(`$relative(cwd, fileName): Emit skipped`)

错误: throw new UnsupportedOperationException("方法未反编译

Eclipse + Spring Boot 中“throw new SilentExitException()”处的断点