抛出新的 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
.
的函数
我有一个函数,代码如下:
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
.