如何在Go中实现PHP函数`die()`(或`exit()`)?

时间:2016-07-27 06:24:43

标签: go exit die

在PHP中,die()用于停止运行脚本以防止意外行为。在Go中,处理句柄功能的惯用方法是什么? panic()return

4 个答案:

答案 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/KjGFZzTrJ7https://play.golang.org/p/Q4iciT35kP