2012-11-30 39 views
6

Có cách nào tốt hơn để trở về từ chuỗi dài các cuộc gọi hàm đệ quy không? Tôi hiện đang hoảng sợ với giá trị đánh dấu như sau:hoảng sợ cho lợi nhuận đa cấp

type exitNow int 
... 
panic(exitnow(0)) 

để trả lại nhiều cấp cùng một lúc. Tại chức năng gốc, một cuộc gọi để phục hồi xử lý lỗi chung (biến panics thành lỗi) và xử lý exitNow như một trường hợp đặc biệt.

Điều này làm việc tốt Tôi chỉ muốn biết nếu có một cách tốt hơn.

Tôi đã sử dụng giá trị trả lại bool cho mục đích liên quan nhưng việc sử dụng một giá trị khác cho điều này sẽ là một cơn đau. (mọi cuộc gọi đến mọi chức năng sẽ cần một statment)

Nếu nó giúp ích cho bất kỳ điều này là một phần của sự cố gắng của một trình phân tích cú pháp phong nha.

+0

Trình phân tích cú pháp quảng cáo - có thể bạn biết, có thể bạn không biết và có thể bạn muốn kiểm tra [go yacc] (http://golang.org/cmd/yacc/). – zzzz

+0

yacc yick: p Tôi không bao giờ thích các công cụ như vậy, thú vị hơn khi viết các trình phân tích cú pháp bằng tay ... –

Trả lời

3

Tôi tự sử dụng phương pháp này trong các trình phân tích cú pháp của mình. Tôi không hoảng sợ với một giá trị số nguyên mặc dù. Tôi sử dụng lỗi hiện tại thực tế làm tin nhắn hoảng loạn. Cuộc gọi cấp cao nhất thực hiện recover() chỉ cần nối thêm một số thông tin về tệp/dòng/cột và sau đó trả lại thông tin đó là error thông thường.

Phương pháp này và chỉ trả lại lỗi từ tất cả các hàm là cách duy nhất để thực hiện việc này trong Go. Cách tiếp cận hoảng sợ là rất nhiều hiệu quả hơn cho trường hợp phân tích cú pháp, vì nó làm cho các quy tắc lexer đơn giản hơn nhiều để thực hiện (và đọc) vì không có các phần if err != nil { return } được phân tán ở khắp mọi nơi.

+0

Tôi không rõ lắm nhưng tôi sử dụng điều này cho sự tương đương của từ khóa thoát cũng như xử lý các chuỗi thông báo lỗi. Tôi thích quan điểm của bạn về nó sạch hơn, nhưng nó vẫn cảm thấy một chút hacky –

+1

Tài liệu cổ điển ["Trì hoãn, Hoảng sợ và Phục hồi"] (http://golang.org/doc/articles/defer_panic_recover.html) thực sự thúc đẩy phong cách này xử lý lỗi để viết các trình phân tích cú pháp. Vì vậy, ngay cả khi nó cảm thấy hacky, nó chỉ là okay. – kostix

+0

Xem thêm ["Xử lý lỗi trong Go"] (http://blog.golang.org/2011/07/error-handling-and-go.html). – kostix

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