У меня есть функция со следующим кодом:
if (!File::exists(i_filename)) throw new FileNotFoundException(i_filename);
Моя FileNotFoundException выглядит так
.час
#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);
Кто-нибудь знает в чем дело? Извините, но я никогда раньше не создавал класс исключений.
Как уже отмечалось в комментариях, вам нужен блок 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
,
Других решений пока нет …