2013-12-10 20 views
7

Khi tôi mở kết nối ổ cắm, tôi ngay lập tức đặt logic socket.Close() vào một chức năng trì hoãn sau khi mở ổ cắm. Tuy nhiên, nếu socket.Close() sẽ gây ra một hoảng sợ? Tôi có nên tổ chức trì hoãn/khôi phục khác bên trong trì hoãn bên ngoài để ngăn chương trình của tôi bị lỗi không? Một cái gì đó như thế này: http://play.golang.org/p/GnEMQS-0jjKết nối đóng an toàn trong Golang

Cảm ơn, Elgs

+2

socketĐóng() không thể gây ra cơn hoảng loạn IIRC. – fuz

+2

Tôi không hoàn toàn chắc chắn: Đóng (ví dụ: net.TCPConn) có thể dẫn đến lỗi nhưng tôi cho rằng nó không gây hoảng sợ. Và nếu nó hoảng sợ, ví dụ: do hỏng phần cứng hoặc hết bộ nhớ, ứng dụng của bạn vẫn bị thổi. Tùy thuộc vào trường hợp của bạn, bạn có thể muốn xử lý lỗi trả về, nhưng việc xử lý sự hoảng loạn trong Close có vẻ hơi hoang tưởng. – Volker

+0

@FUZxxl khi tôi cố gắng đóng một ổ cắm máy khách bị từ chối kết nối bởi máy chủ, nó hoảng loạn. Có cách nào để biết liệu một ổ cắm có an toàn để đóng mà không cần panicking hay không. Hoặc tôi có phải tổ chức thêm một mức độ trì hoãn chỉ cho logic đóng socket. –

Trả lời

7

Nói chung, bạn không cần phải lo lắng nhiều về cơn hoảng loạn. Chúng thường đại diện cho hai loại lỗi: lỗi của nhà phát triển (tham chiếu nil, mảng ngoài giới hạn) và lỗi cấp hệ thống mà bạn có thể không làm được nhiều (như hết bộ nhớ).

Khi người khác nói socket.Close sẽ không hoảng sợ, thay vào đó nó trả về lỗi. Nếu bạn làm:

defer socket.Close() 

Lỗi này bị hủy và bạn không cần phải làm gì khác.

Nhưng giả sử bạn đã muốn phục hồi sau hoảng loạn. Nếu bạn xử lý phục hồi được hoãn lại đầu tiên sau đó bạn không cần phải làm bất cứ điều gì khác:

func main() { 
    defer func() { 
    if err := recover(); err != nil { 
     fmt.Println(err) 
    } 
    }() 
    defer panic("this will be recovered") 
} 

chức năng thu nhập hoãn lại được chạy theo thứ tự ngược lại: http://golang.org/ref/spec#Defer_statements

chức năng nhập hoãn lại phải được thực hiện ngay lập tức trước khi xung quanh chức năng trả về, theo thứ tự ngược lại chúng được hoãn lại.

Các vấn đề liên quan