我试图使观察到的是,当检测到错误时,将再次执行该操作,但是确实注意到了某些情况,当执行带有“重试”运算符的“ on_error()”时,将仅重新运行可观察到的,但是,可观察到的当前实例仍在当前堆栈中,换句话说,它仍然处于活动状态
我确实做了测试以验证行为
#include <string>
#include "rxcpp/rx.hpp"
class test_class
{
public:
int a;
test_class() {
printf("Create Obj \n");
a = 1;
}
~test_class() {
printf("Destroy Obj \n");
a = 0;
}
};
int main()
{
// Create Observable request
auto values = rxcpp::observable<>::create<std::string>(
[&](rxcpp::subscriber<std::string> subscriber) {
test_class test;
while (subscriber.is_subscribed()) {
std::exception_ptr eptr = std::current_exception();
subscriber.on_error(eptr);
int a;
a = 2;
subscriber.on_next("normal");
}
})
.retry()
.as_dynamic();
values.
subscribe(
[](std::string v) {
printf("OnNext: %s\n", v.c_str()); },
[](std::exception_ptr ep) {
printf("OnError: %s\n", rxcpp::util::what(ep).c_str()); },
[]() {
printf("OnCompleted\n"); });
}
所以,我的输入输出是
Create Obj
Create Obj
Create Obj
Create Obj
...
我也希望看到“销毁对象”的输出
我也有堆栈溢出异常
我的目标是,执行一个可观察对象,当触发错误时,可以重新启动该对象,但是销毁了当前对象,以防止堆栈溢出异常
也许还有另一种方法可以做到,您能帮我吗?
答案 0 :(得分:0)
我找到了可能的解决方案,我只删除了Observable内的循环并重试了运算符,然后在“订阅”操作中添加了一个循环
我知道这不是一个“优雅”的解决方案,但这就是我想要做的想法,您能在这方面帮我吗? 如何使用RxCPP库更好的方法?
#include <string>
#include "rxcpp/rx.hpp"
class test_class
{
public:
int a;
test_class() {
printf("Create Obj \n");
a = 1;
}
~test_class() {
printf("Destroy Obj \n");
a = 0;
}
};
int main()
{
// Create Observable request
auto values = rxcpp::observable<>::create<std::string>(
[&](rxcpp::subscriber<std::string> subscriber) {
test_class test;
//while (subscriber.is_subscribed()) {
std::exception_ptr eptr = std::current_exception();
subscriber.on_error(eptr);
int a;
a = 2;
subscriber.on_next("normal");
//}
});
//.retry()
//.as_dynamic();
for (;;) {
values.
subscribe(
[](std::string v) {
printf("OnNext: %s\n", v.c_str()); },
[](std::exception_ptr ep) {
printf("OnError: %s\n", rxcpp::util::what(ep).c_str()); },
[]() {
printf("OnCompleted\n"); });
}
}
这是我的输出:
Create Obj
OnError: bad exception
Destroy Obj
Create Obj
OnError: bad exception
Destroy Obj
没有堆栈溢出异常错误