在PHP中,die()
用于停止运行脚本以防止意外行为。在Go中,处理句柄功能的惯用方法是什么? panic()
或return
?
答案 0 :(得分:2)
您应该使用os.Exit
。
退出导致当前程序以给定的状态代码退出。 通常,代码零表示成功,非零表示错误。该 程序立即终止;延期函数不会运行。
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("Start")
os.Exit(1)
fmt.Println("End")
}
甚至,您可以使用panic
,它也会停止正常执行,但在执行停止时抛出错误。
恐慌内置功能可以停止当前的正常执行 够程。当函数F调用恐慌时,F的正常执行停止 立即。执行由F延迟执行的任何函数都将运行 以通常的方式,然后F返回其调用者。给来电者G, 然后,F的调用就像是对恐慌的调用,终止了G' 执行并运行任何延迟函数。这一直持续到所有 执行goroutine中的函数已按相反顺序停止。 此时,程序终止并且错误条件为 报道,包括恐慌论证的价值。这个 终止序列称为恐慌,可以通过控制 内置功能恢复。
package main
import "fmt"
func main() {
fmt.Println("Start")
panic("exit")
fmt.Println("End")
}
答案 1 :(得分:1)
您可以在HTTP处理程序中使用panic
。服务器将处理它。请参阅Handler。
如果ServeHTTP发生混乱,服务器(ServeHTTP的调用者)假定恐慌的影响与活动请求隔离。它恢复了恐慌,将堆栈跟踪记录到服务器错误日志,并挂断连接。
函数panic
保留用于程序无法继续的情况。无法仅提供一个请求与无法继续工作不同,因此我会记录错误,设置正确的HTTP状态并使用return
。请参阅Effective Go。
向调用者报告错误的常用方法是将错误作为额外返回值返回。规范的Read方法是一个众所周知的例子;它返回一个字节数和一个错误。但如果错误无法恢复怎么办?有时程序根本无法继续。
答案 2 :(得分:1)
在Go中断开函数的惯用方法是使用panic()
。这是在运行时停止执行事件的实际方法。如果您想恢复恐慌,可以使用内置的recover()
功能。
恐慌解释:
恐慌是一种内置功能,可以阻止普通的控制流程 并开始恐慌。当函数F调用恐慌时,执行F 停止,F中的任何延迟函数都正常执行,然后是F. 返回其调用者。
https://blog.golang.org/defer-panic-and-recover
恢复说明:
恢复是一种内置功能,可以重新控制恐慌 够程。恢复仅在延迟函数内有用。中 正常执行,恢复调用将返回nil而没有其他 影响。如果当前的goroutine恐慌,恢复的呼叫将 捕获恐慌的值并恢复正常执行。
https://blog.golang.org/defer-panic-and-recover
这是一个简单的例子:
package main
import "fmt"
func badCall() {
panic("Bad call happend!")
}
func test() {
defer func() {
if err := recover(); err != nil {
fmt.Printf("Panicking %s\n\r", err)
}
}()
badCall()
fmt.Println("This is never executed!!")
}
func main() {
fmt.Println("Start testing")
test()
fmt.Println("End testing")
}
答案 3 :(得分:1)
如果您不想在退出程序后打印堆栈跟踪,则可以使用os.Exit
。您还可以使用.events:hover {
-webkit-animation-play-state: paused;
-moz-animation-play-state: paused;
-o-animation-play-state: paused;
animation-play-state: paused;
}
设置特定的退出代码。
示例(https://play.golang.org/p/XhDkKMhtpm):
os.Exit
另请注意,package main
import (
"fmt"
"os"
)
func foo() {
fmt.Println("bim")
os.Exit(1)
fmt.Println("baz")
}
func main() {
foo()
foo()
}
会立即停止程序,并且不会运行任何延迟函数,而os.Exit
会执行。请参阅https://play.golang.org/p/KjGFZzTrJ7和https://play.golang.org/p/Q4iciT35kP。