c++ - QTimer 单发,在捕获中传递 lambda 异常
问题描述
我正在使用 Qt 5.15.0。我有一个 try-catch 块,如下所示:
try
{
//some code here
}
catch(std::exception& e)
{
QTimer::singleShot(0,[e](){ throw e;});
}
我收到一条被视为错误 C4702: QtCore\qobjectdefs_impl.h(146): warning C4702: unreachable code 的警告。知道出了什么问题吗?从捕获中删除 e 并将 lambda 保留为空可以解决问题,所以看起来它与此有关?谢谢
解决方案
这基本上是噪音,您可以忽略该警告。它来自 Qt 如何包装你的仿函数。错误位置周围的代码如下所示:
template <typename, typename, typename, typename> struct FunctorCall;
template <int... II, typename... SignalArgs, typename R, typename Function>
struct FunctorCall<IndexesList<II...>, List<SignalArgs...>, R, Function> {
static void call(Function &f, void **arg) {
f((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
}
};
编译器抱怨ApplyReturnValue<R>(arg[0])
表达式不会被执行。这是一个有效的投诉,但该代码不必运行,所以没有什么可担心的,因为在你的情况下ApplyReturnValue<R>
,实际上是ApplyReturnValue<void>
因为 lambda 没有返回值,因此重写operator,
什么都不做:
template<typename T>
void operator,(T, const ApplyReturnValue<void> &) {}
因此,您可以选择性地仅针对那段代码禁用该警告,即:
try
{
// some code here
}
catch(std::exception& e)
{
#pragma warning(push)
#pragma warning(disable : 4702)
QTimer::singleShot(0,[e](){ throw e;});
#pragma warning(pop)
}
而且,如果您知道您正在运行的线程是主线程,则可以使用QMetaObject::invokeMethod(qApp, [e]{ throw e; }, Qt::QueuedConnection);
零计时器代替零计时器,尽管不可否认它是更多的文本,所以我想这取决于一个人的偏好,而没有明显更好的语法。
推荐阅读
- hadoop - 如何仅获取昨天的纱线完成/失败工作列表
- javascript - 在 1 个网页中使用 2 个不同的 React App
- c# - 如何读取没有一些文本的文本文件
- go - Go generics:是否可以嵌入泛型结构?
- visual-studio-code - 在 Rust 和 VSCode 的新行中继续 Docstring
- kubernetes-pvc - 使用卷的 pvc 标签创建 pod
- sql-server - 增加数据库服务器日志文件的大小
- javascript - 如何将 API 结果显示在屏幕上?
- laravel - 如何使用 OR 代码处理 where 括号?
- joomla - 可自定义字段未保存到 Joomla 中的数据库中