我对cs类的赋值是创建两个继承自std :: logic_error的自定义异常类:OverflowingSwimmingPoolException和UnderflowingSwimmingPoolException。尝试非法操作时,创建并抛出自定义异常,而不是仅打印错误消息。在驱动程序代码中包含try ... catch块以捕获任何异常。
这是我头文件的一部分:
#ifndef SWIMMINGPOOL_H
#define SWIMMINGPOOL_H
#include <stdexcept>
#include <iostream>
using namespace std;
namespace cs52
{
class OverflowingSwimmingPoolException: public logic_error
{
OverflowingSwimmingPoolException (){};
};
class UnderflowingSwimmingPoolException: public logic_error
{
UnderflowingSwimmingPoolException(){};
};
这里是编译器在构造函数所在的行上说: &#39; cs52 :: UnderflowingSwimmingPoolException&#39;的构造函数必须显式初始化基类&#39; std :: logic_error&#39;它没有默认的构造函数。
这就是我在实现文件中的内容:
#include "SwimmingPool.h"
#include <stdexcept>
#include <iostream>
using namespace std;
namespace cs52
{
SwimmingPool operator +(const SwimmingPool& pool1, const SwimmingPool& pool2) throw (OverflowingSwimmingPoolException, UnderflowingSwimmingPoolException)
{
SwimmingPool temp;
temp.mySize = pool1.mySize+pool2.mySize;
temp.myContents = pool1.myContents+pool2.myContents;
if (temp.myContents>temp.mySize)
throw OverflowingSwimmingPoolException();
return temp;
}
SwimmingPool operator -(const SwimmingPool& pool1, const SwimmingPool& pool2) throw (OverflowingSwimmingPoolException, UnderflowingSwimmingPoolException)
{
SwimmingPool temp;
temp.mySize= pool1.mySize-pool2.mySize;
temp.myContents= pool1.myContents-pool2.myContents;
if (temp.myContents>temp.mySize)
throw OverflowingSwimmingPoolException();
if (temp.myContents<0 || temp.mySize<0)
throw UnderflowingSwimmingPoolException();
return temp;
}
}
编译器在我抛出异常类的行中显示错误。它说:调用类cs53的私有构造函数:OverflowingSwimmimgPoolException。
我的驱动程序文件的部分应该是这样的:
using namespace cs52;
try {
SwimmingPool badPool = smallOne - bigOne;
cout << "This should never happen..." << endl;
}
catch( UnderflowingSwimmingPoolException uspe ) {
cout << "working..." << endl;
}
catch( OverflowingSwimmingPoolException uspe ) {
cout << "This should never happen..." << endl;
}
我刚刚开始编写代码,所以我真的不明白像库中已经创建的std :: logic_error这样的类是如何工作的。
答案 0 :(得分:1)
在派生异常的构造函数中,必须调用基类which takes a string containing some error text的构造函数,如下所示:
@foreach ($students as $student)
<div>
<img src="{{ asset('/assets/students/' . $student->id .'/thumbnail.png') }}" alt="" width="50px" height="50px">
</div>
@endforeach
当您在捕获的异常上调用OverflowingSwimmingPoolException ()
: std::logic_error("It's all gone horribly wrong!")
{};
时(假设您没有使用不同的行为覆盖它;但不要这样做),将返回此内容:
what()
异常类型的接口通常会为此目的获取字符串,但当然对于您自己的异常类型,您不必这样做。
请注意,如果您使用基类try {
// ...
} catch (std::exception const& e) {
std::cerr << e.what() << '\n'; // Prints "It's all gone horribly wrong!"
}
例外,请确保通过引用(或引用到catch
)来捕获,以避免object slicing。
答案 1 :(得分:1)
错误非常明确,与逻辑无关或何时,何地以及如何抛出异常。它只是关于异常类本身和构造函数。
注意错误说你必须初始化父类?您可以使用构造函数初始化列表来执行此操作,例如,
const
OverflowingSwimmingPoolException ()
: std::logic_error("Some error message")
{}
初始化中的错误消息是what
函数将报告的内容。
答案 2 :(得分:0)
编译器消息&#34;必须显式初始化基类&#st; :: logic_error&#39;它没有默认的构造函数&#34;是因为std::logic_error
在初始化期间需要参数。具体来说,它需要一个字符串。例如:
class my_exception: public std::logic_error {
my_exception() { };
}
......不起作用,但......
class my_exception: public std::logic_error {
my_exception(const char* what): std::logic_error(what) { };
}
...会因为没有构造函数std::logic_error::logic_error()
,但只有一个std::logic_error::logic_error(const char*)
。
如果您想指定例外&#34;原因&#34; (由what
)静态地为特定的异常类提供,您可以在构造期间指定它,例如......
class my_exception: public std::logic_error {
my_exception(): std::logic_error("Oh No!") { };
}
所有标准异常都从std::exception
继承,期望出现异常的原因。后来,这个原因可以类似于......
try {
throw my_exception();
} catch (const std::exception& e) { // << because you inherited this class
std::cerr << "error: " << e.what() << std::endl;
}
...会打印&#34;错误:哦不!&#34;使用前面的例子。
具体来说,请参阅std::logic_error和std::exception了解详情。