抛出新的OwnExceptionClass让程序崩溃

时间:2016-01-22 18:37:20

标签: c++ class exception unhandled

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

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

有谁知道什么是错的?抱歉,我以前从未创建过异常类。

1 个答案:

答案 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的函数。