throw new OwnExceptionClass 让程序崩溃
Posted
技术标签:
【中文标题】throw new OwnExceptionClass 让程序崩溃【英文标题】:throw new OwnExceptionClass lets program crash 【发布时间】:2016-01-22 18:37:20 【问题描述】:我有一个函数,代码如下:
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);
有谁知道怎么回事?抱歉,我之前从未创建过异常类。
【问题讨论】:
您使用的 try catch 块在哪里? 是的。如果你抛出一个异常,它必须在某个地方被捕获。否则你会得到你所得到的。 呃?你认为抛出异常到底有什么作用? @user3874443 您可能想了解异常的目的 顺便说一句,不会动态分配异常。这不是Java。只需写throw FileNotFoundException()
(纠正拼写后!)
【参考方案1】:
正如 cmets 已经展示的那样,您需要一个 try-catch 块来捕获异常。否则你将无法告诉编译器应该发生什么,什么时候抛出异常。
顺便说一句,在 C++ 中抛出指针是个坏主意,因为在 catch 块中匹配的类型可能与预期不同。改为抛出一个值并捕获对它的引用:
if (!File::exists(i_filename))
throw FileNotFountExceptioni_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_filenamei_filename ;
private:
std::string m_filename;
;
这将使用i_filename
的副本初始化m_filename
,而您的实现将使用空字符串初始化m_filename
,然后复制i_filename
的内容。
如果你的构造函数很简单,你应该更喜欢直接在头文件的声明中定义。它将像声明为inline
的函数一样编译。
【讨论】:
好吧,我慢慢地但肯定地理解了如何使用异常......以及在 catch 块中做什么?你写了“在这里处理异常”,但我会在 Exception 类中做所有事情。 不,这不是一个好地方。如果从未出现异常,编译器可能会采取一些捷径并排除您的假设。当它可以证明它在任何情况下都不会被咳嗽时,它甚至可以剥离代码来调用异常类的构造函数。只需按原样使用它们,它们就该被使用,您就不会受到意外的伤害。 好的,谢谢。我将仔细研究异常。以上是关于throw new OwnExceptionClass 让程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在catch块中throw new Exception的意义(转)
throw new OwnExceptionClass 让程序崩溃
throw new TypeError('“继承”的超级构造函数不能 ' +
throw new TypeError(`$relative(cwd, fileName): Emit skipped`)
错误: throw new UnsupportedOperationException("方法未反编译
Eclipse + Spring Boot 中“throw new SilentExitException()”处的断点