首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码c++的最佳实践

编码c++的最佳实践
EN

Stack Overflow用户
提问于 2015-11-20 17:57:00
回答 6查看 1.2K关注 0票数 5

我想知道,当函数有状态返回时,是否有更好的方法来编写代码。

下面是一个例子。(如果有,请忽略简单的代码错误。我专门说的是结构。另外,我正在工作,在这台计算机上没有编译器)

代码语言:javascript
复制
#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语句的大嵌套。有更易读的方式来写这样的东西吗?它很快就会变成老鼠窝。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-11-20 18:03:50

在现代C++编程中,通常情况下,如果您遇到程序不能继续的错误,那么我认为最好是throw异常。

因此,您的函数将不会返回任何内容(即,无效)。每当它遇到无法继续的情况时,您就会throw一个异常,它告诉错误是什么。然后调用代码将处理错误。

这样做的好处是,您可以选择,在哪里使用来处理错误。例如,堆栈可能会将所有内容解压到main

您的代码可能如下所示:

代码语言:javascript
复制
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()将根据这个新函数实现。我发现,在大多数情况下,只在有限的情况下编写这些双重函数。

票数 6
EN

Stack Overflow用户

发布于 2015-11-20 18:03:58

我喜欢减少筑巢,像这样:

代码语言:javascript
复制
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会被额外检查一次。但这是一个很小的代价,为简单。

这也有利于资源的取消分配和结束时关闭文件,而不管错误发生在哪里。

票数 1
EN

Stack Overflow用户

发布于 2015-11-20 18:13:22

  • 如果您在下面的语句中使用if-elsereturn (对于throwing BTW来说,这是一个很好的例子),则不需要throw。普通的if就可以了。
  • 您打印的消息类型通常更适合stderr而不是stdout (cerr而不是cout)。
  • 如果您决定继续使用错误状态,符号常量(或枚举或定义)通常比“魔术数字”更可取。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33833116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档