-1

我有一个带有以下代码的函数:

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
}

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

有谁知道出了什么问题?抱歉,我之前从未创建过异常类。

4

1 回答 1

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

于 2016-01-22T19:17:35.920 回答