2012-06-12 80 views
9

Tôi nhận được error được trả về từ cuộc gọi io.Copy, mà tôi đã chuyển một ổ cắm (TCPConn) làm điểm đến. Dự kiến ​​rằng máy chủ từ xa sẽ chỉ đơn giản là ngắt kết nối khi họ đã có đủ, và tôi không nhận được bất cứ thứ gì từ họ.Lọc các lỗi ống bị hỏng

Khi thả xảy ra, tôi nhận được lỗi này:

write tcp 192.168.26.5:21277: broken pipe 

Nhưng tất cả tôi có là một giao diện error. Làm thế nào tôi có thể phân biệt lỗi đường ống bị hỏng từ các loại lỗi khác?

if err.Errno == EPIPE... 

Trả lời

12

Lỗi đường ống bị hỏng được xác định trong gói syscall. Bạn có thể sử dụng toán tử bình đẳng để so sánh lỗi với toán tử syscall. Kiểm tra http://golang.org/pkg/syscall/#constants để biết danh sách đầy đủ các lỗi syscall. Tìm kiếm "EPIPE" trên trang và bạn sẽ tìm thấy tất cả các lỗi đã xác định được nhóm lại với nhau.

if err == syscall.EPIPE { 
    /* ignore */ 
} 

Nếu bạn muốn để có được số errno thực tế (mặc dù nó là khá vô dụng), bạn có thể sử dụng một loại khẳng định:

if e, ok := err.(syscall.Errno); ok { 
    errno = uintptr(e) 
} 
+0

Điều này giống như một người chiến thắng, tôi sẽ cho đi. –

+0

Bạn đã so sánh nó với công việc syscall.EPIPE? –

+5

Có. Ngoài ra, tôi phải gõ-assert vào 'net.OpError' trước, sau đó so sánh' opErr.Err == syscall.EPIPE'. –

-1

Có tất cả nhưng giao diện error đủ để thực hiện xác nhận loại hoặc công tắc loại để hiển thị loại bê tông do giao diện giữ.

+2

Điều đó không cho tôi biết nơi các loại bê tông cho lỗi này là được tổ chức. –