Arduino中的try/catch块

23
我正在使用Arduino进行套接字通信,并且我需要使用try/catch块来进行适当的处理,你们有什么建议?我的互联网搜索没有成功。
编辑:
我正在使用WiFly模块与移动应用程序交互的代码来构建一个机器人模块,使用Android对移动应用程序进行一些控制,一切都运作得非常好,但有时套接字会断开连接,因此我需要添加处理此类情况的代码,类似于try/catch块,但我没有找到适用于Arduino的类似块。
我的代码:
void loop() {
    Client client = server.available();
    if (client) {
        while (client.connected()) {
            if (client.available()) {
                // Serial.print("client connected \n");
                char c = client.read();

                if(c == 'L')
                    turnLeft();
                if(c == 'R')
                    turnRight();
                if(c == 'F')
                    goForward();
                if(c == 'B')
                    goBackward();
                if(c == 'S')
                    Stop();

                Serial.print(c);
            }
        }

        // give the web browser time to receive the data
        delay(100);
        client.stop();
    }
}

你需要给我们更多的信息...比如你尝试了什么,你发现了什么... - user123_456
我刚刚更新了问题。 - NZal
1
使用看门狗定时器来监视错误是一种替代方法。通过一些巧妙的EEPROM跟踪更改,在重新启动时,您可以找出下一个未成功的步骤,并将其记录为已跳过,并始终跳过它(或以任何您想要的方式处理它)。 - TamusJRoyce
1
这个仓库包含了一个 C 语言的 try/catch 实现,如果有人真的需要的话。链接 - mikeLundquist
3个回答

31

Arduino参考文档没有列出try catch(关于原因的详细信息,请参考这个相关答案)。我认为,在微控制器上实现try catch可能会有一些困难或不可能。

在大多数编程语言中,try catch是一个非常昂贵的操作:程序堆栈会为try块和每个catch块复制一次。如果try出错,try块的堆栈将被丢弃,并执行其中一个catch块的堆栈。
虽然我不是CPU架构的专家,但我可以想象,这需要大量的内存交换和类似的操作,对于一个简单的微控制器来说应该很难实现。

也许值得看看C程序员如何使用类似try/catch的模式。


16
Arduino不支持异常处理。然而,你不需要使用异常处理来使你的代码更加健壮。通过简单地检查可能失败的函数的返回值,你可以达到相同的目的。
由于每次循环都会检查client.connected(),并且如果未连接,则client.available()将返回0,因此唯一可能未被处理的故障是从client.read()返回的值。
你可以通过更改以下行来解决此问题。
char c = client.read();
to:
int i = client.read();
if (i == -1) {
    break;
}
char c = (char) i;

1
很遗憾,错误处理不可用...所提到的替代方案“强大的返回值检查”是值得怀疑的。许多函数,如Serial.print,几乎没有提供任何信息,表明它们是否成功执行。这是一种选择,但目前我仍然无法解决如何避免我的草图因为Serial.print无法释放其数据而崩溃并耗尽内存的问题! - humanityANDpeace
我遇到过许多次SRAM不足的问题,你说得对,没有什么好的方式可以通过编程来检查它。通常情况下,最明显的症状是串行输出损坏。如果你只是想了解你的草图正在使用多少内存,你可以使用MemoryFree库检查可用的SRAM数量(最简单的方法是将MemoryFree.cpp代码从http://playground.arduino.cc/Code/AvailableMemory复制到你的草图中并调用`freeMemory()`)。 - Matthew Murdoch

2
/* this builds successfully */
try {
  /* code */
} catch(String error) {

}

你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P
确实有效! - mvermand
确实有效! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接