我有一个简单的风格问题。在我正在编写的应用程序中,有几个类方法包括try / catch块以及块外部的函数,这取决于块的结果。例如(在psudo代码中):
try {
start_transaction;
persist_data;
stop_transaction;
}
catch {
rollback_transaction;
}
finally {
}
if (transaction_successful)
send_message;
如果事务成功,我可以考虑测试的唯一方法是在try catch块中设置方法变量标志,然后在if语句中测试它。当然这可行,但我很想知道传统的“智慧”是什么呢?也许“send_message”应该在try catch块中,尽管这可能是不必要的混乱?我想这是一个相当直接的问题 - 只是试图确保我的代码结构良好/有条理。
答案 0 :(得分:4)
您似乎需要多考虑一下软件的正确分层/增加此类/方法的内聚力。 从提供的示例看来,在这里你有DAL /业务层混合(persistense +一些业务活动),这是你需要在catch块后面的同一方法中对事务结果做出反应的主要原因。
通过适当的分层,它可能如下所示:
当然你可以设置标志(如你所建议的)并使用AOP建议处理这种情况(特别是如果'send_message'是辅助功能)。
答案 1 :(得分:1)
将它放在try
块中就足够简单了。 “杂乱的代码”是个人喜好的问题,但这使事情变得简单。
答案 2 :(得分:1)
假设(虽然从你的代码中看起来非常明显)你正试图发送一条消息,当且仅当交易成功时,我认为把它作为一部分是有意义的尝试块本身。
在我看来,它不会是“不必要的混乱”,因为消息需要在成功时发送。如果消息包含要发送的部分,即使事务失败,那么保持标记并跟踪事务状态(并相应地修改消息)显然是有意义的。
答案 3 :(得分:1)
将它放在try
块中,但是如果在执行send_message
时抛出异常,最好有自己的catch
块 - 这是通过指定适当的异常来完成的类。