бросить новый OwnExceptionClass позволяет сбой программы

У меня есть функция со следующим кодом:

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

Кто-нибудь знает в чем дело? Извините, но я никогда раньше не создавал класс исключений.

-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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]