抛出新的 OwnExceptionClass 让程序崩溃

throw new OwnExceptionClass lets program crash

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

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);

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

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

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

if (!File::exists(i_filename))
    throw FileNotFountException{i_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_filename{i_filename} {};
    private:
        std::string m_filename;
};

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

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

的函数