c++ - 为什么这个程序对 throw 不做任何事情?
问题描述
我正在在线阅读一些函数的代码,它有这个抛出句。
我实现了相同的函数,但是当我调用它以确保它抛出(通过使 x 为负数)时,我的代码不起作用,因为我没有“处理异常”。
但是图片中的代码也没有,所以这里发生了什么?
基本上我正在寻找的是当有人向函数输入错误参数时调用的函数,然后该函数只是停止程序并说“不,你做错了”。我怎么做?
我在网上阅读了一些关于投掷、接球和尝试的内容,但实际上,我不想那样做。我只想做一件事,一旦它感觉到有问题就停止程序。
解决方案
如果您想生成一些消息(例如在控制台输出中),您可以简单地修改第一个条件:删除 throw,将输出添加到 std::cout 并返回一些值(例如 0)。即替换
if (x < 0.0 || a <= 0.0) throw("bad args in gammq");
经过
if (x < 0.0 || a <= 0.0)
{
std::cout << "bad args in gammq";
return 0.;
}
但这意味着您需要检查函数的结果是否有可能使用它,因为 0 现在表示错误。否则,您可以将计算加入 try 块并捕获该块的异常。并且为案例生成 std::invalid_argument 异常更准确。所以条件:
if (x < 0.0 || a <= 0.0) throw("bad args in gammq");
最好修改为
if (x < 0.0 || a <= 0.0) throw std::invalid_argument("bad args in gammq");
请记住
#include <stdexcept>
它定义了 std::invalid_argument。用法是:
try
{
Doub a,x;
// some computations and initialization of a and x
Doub val = gammq(a,x);
// some other computations
}
catch(std::invalid_argument& e)
{
std::cout << e.what();
}
一旦 gammq 收到错误的参数,try 块内的计算将被终止,catch 块将在控制台输出中生成消息。
推荐阅读
- javascript - HTML/CSS JavaScript 中的水平菜单滚动条
- firebase - 无需部署云功能即可修改firestore数据的简便方法
- javascript - 离开或刷新页面时如何弹出自定义模态?
- ios - 按钮 onclick 适用于 android 但不适用于 ios
- javascript - 在不修改原始数组的情况下将数组复制和计算到另一个数组
- keyboard - AQTime 重新映射标准键盘快捷键?
- android - 在 Android Auto 中镜像现有的 android 应用程序
- java - 尝试从 Saucelabs 中的 android 模拟器调用 chrome 浏览器时无法创建新会话?
- elasticsearch - Python elasticsearch-dsl doctype 更新超时
- google-sheets - 将数据从谷歌表格导入谷歌表单