当使用带有try/catch/finally的语言时,D的failure/success/exit作用域语句仍然有用吗?D似乎没有最后,这可能解释了为什么在D中使用这些语句。但是对于像C#这样的语言,它有用吗?我正在设计一种语言,所以如果我看到很多专业人士,我会把它加进去。
发布于 2009-08-08 10:04:06
scope(X)
不是必需的,就像for
不是必需的一样,只要您有if
和goto
。
下面是我今天写的一些代码中的一个改述示例:
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相比:
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)的版本更具可读性,也更容易理解。
发布于 2009-08-08 04:28:18
免责声明我也是D迷。
someRiskyFunctionThatMayThrow();
lock();
/* we have definitly got the lock so lets active
a piece of code for exit */
scope(exit)
freelock();
对比:
try
{
someRiskyFunctionThatMayThrow();
lock();
}
finally
{
freeLockIfNotGot();
}
发布于 2009-08-08 02:45:52
区分失败-退出和成功-退出有时非常有用--我没有使用D的实际经验,但Python的with
语句也允许这样做,我发现它非常有用,例如,提交或回滚在主体的受保护部分中打开的DB事务。
当我向朋友和同事解释这个新的Python特性(它已经存在了一段时间了;-)时,我发现他们很快就理解了,并看到了拥有这样一个特性的兴趣( C++也有finally
,但这无助于区分成功和失败,就像在其他语言中或C++的“块中自动变量的RAII销毁”等效物)。
https://stackoverflow.com/questions/1247778
复制相似问题