编码c ++的最佳实践

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语句的大嵌套.是否有更可读的方式来写这样的东西?它很快变成了老鼠窝.

编辑:谢谢你的所有回复.我想我对如何更好地构建代码有一些想法.我感谢所有勤奋的建议.

Ano*_*ail 6

在现代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()将根据此新功能实现.我发现在大多数情况下,编写这些双重功能只能在有限的情况下完成.