首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >D的作用域失败/成功/退出是必要的吗?

D的作用域失败/成功/退出是必要的吗?
EN

Stack Overflow用户
提问于 2009-08-08 02:18:40
回答 4查看 3.7K关注 0票数 18

当使用带有try/catch/finally的语言时,D的failure/success/exit作用域语句仍然有用吗?D似乎没有最后,这可能解释了为什么在D中使用这些语句。但是对于像C#这样的语言,它有用吗?我正在设计一种语言,所以如果我看到很多专业人士,我会把它加进去。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-08 10:04:06

scope(X)不是必需的,就像for不是必需的一样,只要您有ifgoto

下面是我今天写的一些代码中的一个改述示例:

代码语言:javascript
复制
sqlite3* db;
sqlite3_open("some.db", &db);
scope(exit) sqlite3_close(db);

sqlite3_stmt* stmt;
sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
scope(exit) sqlite3_finalize(stmt);

// Lots of stuff...

scope(failure) rollback_to(current_state);
make_changes_with(stmt);

// More stuff...

return;

与使用try/catch相比:

代码语言:javascript
复制
sqlite3* db;
sqlite3_open("some.db", &db);
try
{
    sqlite3_stmt* stmt;
    sqlite3_prepare_v2(db, "SELECT * FROM foo;", &stmt);
    try
    {
        // Lots of stuff...
        try
        {
            make_changes_with(stmt);

            // More stuff...
        }
        catch( Exception e )
        {
            rollback_to(current_state);
            throw;
        }
    }
    finally
    {
        sqlite3_finalize(stmt);
    }
}
finally
{
    sqlite3_close(db);
}

代码变成了spaghetti,将错误恢复分散到各处,并强制对每个try块进行一定程度的缩进。在我看来,使用scope(X)的版本更具可读性,也更容易理解。

票数 39
EN

Stack Overflow用户

发布于 2009-08-08 04:28:18

免责声明我也是D迷。

代码语言:javascript
复制
someRiskyFunctionThatMayThrow();
lock();
/* we have definitly got the lock so lets active
a piece of code for exit */
scope(exit)
    freelock();

对比:

代码语言:javascript
复制
try
{
    someRiskyFunctionThatMayThrow();
    lock();
}
finally
{
    freeLockIfNotGot();
}
票数 6
EN

Stack Overflow用户

发布于 2009-08-08 02:45:52

区分失败-退出和成功-退出有时非常有用--我没有使用D的实际经验,但Python的with语句也允许这样做,我发现它非常有用,例如,提交或回滚在主体的受保护部分中打开的DB事务。

当我向朋友和同事解释这个新的Python特性(它已经存在了一段时间了;-)时,我发现他们很快就理解了,并看到了拥有这样一个特性的兴趣( C++也有finally,但这无助于区分成功和失败,就像在其他语言中或C++的“块中自动变量的RAII销毁”等效物)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1247778

复制
相关文章

相似问题

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