我有一个包含以下代码的函数:
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);
有谁知道什么是错的?抱歉,我以前从未创建过异常类。
答案 0 :(得分:1)
正如评论已经显示的那样,你需要一个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;
};
这将使用m_filename
的副本初始化i_filename
,而您的实现将使用空字符串初始化m_filename
,然后复制i_filename
的内容。
如果你的构造函数很简单,你应该更喜欢直接在头文件中的声明中定义。它将被编译为声明为inline
的函数。