Tôi đã tránh sử dụng log.Fatal
, nhưng gần đây tôi đã vô tình phát hiện ra những câu hỏi này; code-coverage và tests-using-log-fatal.Gói Go có nên sử dụng log.Fatal và khi nào không?
Một trong những ý kiến từ những câu hỏi bảo hiểm 100 mã nói:
... Trong hầu hết các trường hợp
log.Fatal
nên chỉ được sử dụng trong các chức năng chính, hoặc init (hoặc có thể một số điều có nghĩa là để được gọi là chỉ trực tiếp từ họ)"
Nó đi tôi suy nghĩ, vì vậy tôi bắt đầu nhìn vào mã thư viện chuẩn được cung cấp với Go. có rất nhiều ví dụ về nơi kiểm tra mã trong thư viện tận dụng log.Fatal
có vẻ ổn. một vài ví dụ bên ngoài của mã kiểm tra, chẳng hạn như trong net/http
, hiển thị dưới đây:
// net/http/transport.go
func (t *Transport) putIdleConn(pconn *persistConn) bool {
...
for _, exist := range t.idleConn[key] {
if exist == pconn {
log.Fatalf("dup idle pconn %p in freelist", pconn)
}
}
...
}
Nếu nó là thực hành tốt nhất để tránh sử dụng log.Fatal
, tại sao là nó được sử dụng ở tất cả trong các thư viện chuẩn, tôi lại có thể ngờ chỉ trả lại một lỗi. Có vẻ như không công bằng đối với người sử dụng thư viện làm cho os.Exit
được gọi và không cung cấp bất kỳ cơ hội nào cho ứng dụng để dọn dẹp.
Tôi có thể ngây thơ, do đó, câu hỏi của tôi như là một thực hành tốt hơn có vẻ là để gọi log.Panic
mà có thể được phục hồi và ứng dụng ổn định dài chạy của tôi lý thuyết có thể có cơ hội tăng từ đống tro tàn.
Vì vậy, thực hành tốt nhất nên nói gì về Tìm hiểu khi nào nên đăng nhập.Tiếp nên được sử dụng?
Tôi hy vọng rằng mã này hoàn toàn không thể truy cập được. Đó là một lỗi gây ra một kết nối nhàn rỗi để được vẫn còn trong danh sách nhàn rỗi trong khi cũng đang được sử dụng như một kết nối hoạt động không phải là một cái gì đó sẽ xảy ra bao giờ hết, và cho nó xảy ra nên được một cái gì đó thảm khốc. Nhưng vì chúng dường như đang sử dụng các mutex đúng cách quanh danh sách nhàn rỗi và vân vân, tôi không biết tại sao vòng lặp và mã này lại cần thiết. Tại sao họ sẽ tiếp tục thoát khỏi chương trình của bạn ngay lập tức thay vì hoảng sợ là một bí ẩn khác. Câu hỏi tuyệt vời. – captncraig
Có bất kỳ thử nghiệm nào trong gói đó có thể tiếp cận được dòng đó không? – captncraig
Câu hỏi hay, có một chút nhìn và không thể nhìn thấy bất cứ điều gì trông giống như thiết kế đặc biệt của nó để đạt được dòng đó. Chưa kết luận ... – miltonb