我想知道,当函数有状态返回时,是否有更好的方法来编写代码。
下面是一个例子。(如果有,请忽略简单的代码错误。我专门说的是结构。另外,我正在工作,在这台计算机上没有编译器)
#include "Session.h"
Session::Session(const char * IPaddress, unsigned int openPort)
{
ssh_session mySession;
hostIP = IPaddress;
port = openPort;
}
int Session::cBeginSession()
{
try
{
int status = ssh_options_set(mySession, SSH_OPTIONS_HOST, &hostIP);
if (status == 0)
{
status = ssh_options_set(mySession, SSH_OPTIONS_LOG_VERBOSITY,
SSH_LOG_PROTOCOL);
if(status == 0)
{
status = ssh_options_set(mySession, SSH_OPTIONS_PORT, &port);
if (status == 0)
{
std::cout << "Session started\n";
return 0;
}
else
{
std::cout << "Unable to set port\n";
return -3;
}
}
else
{
std::cout << "Protocol option log verbosity unable to set\n";
return -2;
}
}
else
{
std::cout << "Unable to set Host address\n";
return -1;
}
}
catch (...)
{
std::cout << "Unknown exception occurred\n";
return -8;
}
}我通常使用带有状态参数的if - end语句,但如果涉及一个或两个以上的函数,则倾向于使用if-end语句的大嵌套。有更易读的方式来写这样的东西吗?它很快就会变成老鼠窝。
编辑:谢谢您的回复。我想我对如何更好地构造我的代码有一些想法。我感谢所有勤奋的建议。。
发布于 2015-11-20 18:03:50
在现代C++编程中,通常情况下,如果您遇到程序不能继续的错误,那么我认为最好是throw异常。
因此,您的函数将不会返回任何内容(即,无效)。每当它遇到无法继续的情况时,您就会throw一个异常,它告诉错误是什么。然后调用代码将处理错误。
这样做的好处是,您可以选择,在哪里使用来处理错误。例如,堆栈可能会将所有内容解压到main。
您的代码可能如下所示:
void Session::cBeginSession()
{
if (ssh_options_set(mySession, SSH_OPTIONS_HOST, &hostIP))
{
// throw an exception
}
if (ssh_options_set(mySession, SSH_OPTIONS_LOG_VERBOSITY, SSH_LOG_PROTOCOL))
{
// throw an exception
}
if (ssh_options_set(mySession, SSH_OPTIONS_PORT, &port))
{
// throw an exception
}
}一旦您掌握了异常编码的诀窍,代码就会变得更干净、更健壮,因为您并不总是担心检查返回代码。
编辑
回答你的评论。您可以选择处理错误的方式和时间。你只需抓住你电话上的异常。但是,通常情况下,如果您想做一些可能失败(但不是结束程序)的事情,您可以创建另一个返回布尔状态的函数。
bool Session::tryCBeginSession()
现在,您的原始函数void Session::cBeginSession()将根据这个新函数实现。我发现,在大多数情况下,只在有限的情况下编写这些双重函数。
发布于 2015-11-20 18:03:58
我喜欢减少筑巢,像这样:
status = fcn1();
if ( status == 0 )
{
// something good
status = fcn2();
}
else
{
// something bad happened. report, and leave status reporting failure.
}
if ( status == 0 )
{
// something good
status = fcn3();
}
else
{
// something bad happened. report, and leave status reporting failure.
}
if ( status == 0 )
{
// something good
status = fcn4();
}
else
{
// something bad happened. report, and leave status reporting failure.
}我喜欢那个错误打印接近错误发生的地方。当然,当发生故障时,status会被额外检查一次。但这是一个很小的代价,为简单。
这也有利于资源的取消分配和结束时关闭文件,而不管错误发生在哪里。
发布于 2015-11-20 18:13:22
if-else或return (对于throwing BTW来说,这是一个很好的例子),则不需要throw。普通的if就可以了。stderr而不是stdout (cerr而不是cout)。https://stackoverflow.com/questions/33833116
复制相似问题