如果在Golang的Web服务器中采用分层架构,我认为使用panic是个不错的选择
别惊慌!!
我非常清楚这个词的存在。
然而,在 Golang 的标准库中还有些地方使用了它。
而且,不仅仅是一个地方,也不是两个地方。
在下面链接的文章中,大概用grep搜索了4000个地点。我觉得其中可能包括了一些测试内容,所以对准确性有一些疑问。。
我认为可能存在着需要使用的情况。
首先,如果絕對不行,這應該不會在語言規範中存在。
因此,我认为只要适当地使用,就应该使用它。
顺便说一下,在我身边即使是对我持有好感的工程师,一提起这个话题也经常被拉扯着距离。。。
在中文中,可以这样表达:不能这样做的情况。
关于Golang的defer关键字和panic/recover机制
引用自上述文章:
在向外部公开的 API 中,不应该使用 panic() 来传递错误信息。
应该使用带有错误接口的多值返回。
panic() 应该避免跨越包传播。panic/recover 机制对于进行深度调用是有用的。
使用它可以提高可读性。
换句话说,使用错误接口来作为向外部传递错误信息的方式是正规的方式,panic/recover 应该仅仅在内部使用。
Golang的编写方式通常会返回错误。
所以,我认为只有某个库使用panic将错误返回给外部是非常麻烦的。
换句话说,只要在内部使用,就没有问题。
在具有分层架构的Web服务器中,我认为可以省去对每个层级的错误进行判断。
关于利益
有很多好处。
-
- エラー時にstacktraceの詳細なものが、必ず取れる
Golang書いてびっくりしたのが、stacktrace頑張らないと出ないんですよね。。
if err != null の記述が大幅に無くなるので、見通しが良くなる
メソッドチェインが出来るようになる
エラーのreturn忘れが無くなる
1値返すメソッドか?、2値返すメソッドか?、あまり考えなくて良くなる
考えることが減るのと、コーディング量が減るので開発が速くなる
どんなエラーが発生しても、必ず捉えられ後処理を実行できる
データベースのTransaction、Rollbackとか
我知道一个工程师,他建议使用Linter,这样就不会忘记返回错误了。
使用像staticcheck这样的Linter工具,它可以指出错误。
然而,我认为没有Linter会让编写代码变得危险且有错误。
我认为Golang可能并不是为Web服务器编写的,但如果使用panic,可以避免一些问题,它是一种可以处理异常情况的语言。
在系统开发过程中认为重要的事情
我认为系统的价值取决于结果的产出。
在我在一家大公司工作时,经常看到一些厉害的成员制作了一项服务,但因为没有销售额而被关闭。
最近,世界变化迅速,如果不能以比变化更快的速度推出产品,到推出的时候就已经过时了。
因此,我认为对于系统开发来说,以下的两个点非常重要。
* 正しく動作すること
* 速く開発が出来ること
想到这一点,
-
- Golang
-
- Webサーバ
-
- 階層型アーキテクチャ
- panic解禁
我觉得这样的组合挺不错的。
考えていることがたくさんあります。
我认为优先考虑结果比较好,你觉得呢?
在开发中,没有银弹。
经常听说没有银弹。
如果是这样的话,
在中国有没有最佳实践呢?
我认为。
如果你作为一名工程师在一年后的水平有所提高,那么目前所写的代码应该会被视为遗留代码。
如果最终变成传统的话,我想团队在目前为止应该尽力而为,达到令人满意的最佳状态。
如果失败的话,责任也是由整个团队承担的。
完全无关的话题,但是据说在代码审查时被指出自己的代码存在问题,有些人会感到生气。
按照团队的规定机械地进行审核,我认为不会出现这种情况,不过你觉得呢?
跟Java的try-catch机制相似。
在不同的情况下,我认为一手糟糕的举措也有可能成为一手好的决策。
Java的try catch只是因为强制执行导致不够好。
我认为,它在代码变得简洁方面非常出色作为错误机制。
而且,这也可以在Golang中实现。
在像Web服务器这样的情况下,外部API(如数据库)的等待时间占主导地位,执行速度的降低也不会引起太多关注。
总结
我看了韩国工程师给我看的Golang书,上面写着可以大胆去使用。
看了一下日本的文章发现没有人写,所以我试着写了一篇。
也许在日本的情况下,只是因为害怕被强烈的批评指责所困扰,所以不能写出来…
系统开发是一系列权衡取舍的过程,我认为以结果是否能够实现为中心进行思考比准确地描述是否正确要更为重要。
在只有两个人的团队中,我们实际使用panic的结果非常令我满意。
也许以后可能会后悔,但目前完全没有这种迹象,到那时再重写就好了。
因为我有认真地写测试,所以应该能应付过去。
最后,虽然是英语的文章,但下面也包含有示例代码,有时间的话请再看一遍。
- Panic like a PRO