Ret*_*her 5 c++ function status
我想知道,当有状态返回的函数时,是否有更好的方法来编写代码.
以下是一个例子.(如果有的话,请忽略简单的代码错误.我特别谈论结构.另外,我正在工作,并且在这台计算机上没有编译器)
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
我通常使用带有状态参数的if-else语句,但如果涉及多于一个或两个函数,我倾向于使用if-else语句的大嵌套.是否有更可读的方式来写这样的东西?它很快变成了老鼠窝.
编辑:谢谢你的所有回复.我想我对如何更好地构建代码有一些想法.我感谢所有勤奋的建议.
在现代C++编程中,通常情况下,如果遇到程序无法继续的错误,那么我认为最好throw是异常.
所以你的函数不会返回任何东西(即void).每当它遇到无法继续的情况时,你会发现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
}
}
Run Code Online (Sandbox Code Playgroud)
一旦你掌握了带有异常的编码,代码往往更清晰,更健壮,因为你并不总是担心检查返回代码.
编辑
回答你的评论.您可以选择处理错误的方式和时间.您可以捕获呼叫之外的异常.但是,一般来说,如果你想做一些可能失败的事情(但不能结束一个程序),你可以创建另一个返回布尔状态的函数.
bool Session::tryCBeginSession()
现在,您的原始功能void Session::cBeginSession()将根据此新功能实现.我发现在大多数情况下,编写这些双重功能只能在有限的情况下完成.