Panic and Recover

GO Language的内置类型系统在编译时会捕获许多错误,但无法检查错误,例如越界数组,访问或nil指针引用,这些错误需要在运行时进行检查。 GO没有异常机制,您不能抛出异常。在执行过程中,当Go检测到这些错误时,它将慌乱并停止所有正常执行,该goroutine中所有延迟的函数调用都将被执行,最后程序崩溃并显示一条日志消息。该日志消息通常具有足够的信息来分析问题的根本原因,而无需重复运行该程序,因此应始终将其包含在有关紧急程序的错误报告中。

Panic是一个内置函数,可停止常规控制流并开始恐慌。当函数X调用panic时,X的执行停止,X中所有延迟的函数都将正常执行,然后X返回其调用方。对于呼叫者,X然后表现得像是发生了恐慌。该过程将继续执行堆栈,直到返回当前goroutine中的所有函数为止,此时程序崩溃。紧急事件可以通过直接调用紧急事件来启动。它们也可能是由运行时错误引起的,例如越界数组访问。

并非所有的恐慌都来自运行时。内置的panic函数可以直接调用;它接受任何值作为参数。当某些“不可能”的情况发生时,恐慌通常是最好的选择,例如,执行达到逻辑上不可能发生的情况:

package main
import "fmt"
func main() {
	var action int
    fmt.Println("Enter 1 for Student and 2 for Professional")
    fmt.Scanln(&action)
    /*  Use of Switch Case in  高朗  */   
    switch action {
        case 1:
            fmt.Printf("I am a  Student")
        case 2:
            fmt.Printf("I am a  Professional")
		default:
			panic(fmt.Sprintf("I am a  %d",action))
    }	
    fmt.Println("")
    fmt.Println("Enter 1 for US and 2 for UK")
    fmt.Scanln(&action)
    /*  Use of Switch Case in  高朗  */   
    switch 	 {
        case 1:
            fmt.Printf("US")
        case 2:
            fmt.Printf("UK")
		default:
			panic(fmt.Sprintf("I am a  %d",action))
    }
}

在上述程序中,如果用户输入除1或2以外的任何其他值,则程序将在第一次切换后停止执行。

恢复是一个内置函数,可以重新获得对紧急恐慌例程的控制。恢复仅在延迟函数内部有用。在正常执行期间,恢复调用将返回nil并且没有其他效果。如果当前goroutine处于恐慌状态,则调用restore会捕获提供给panic的值并恢复正常执行。

package main
import "fmt"
func main() {
	var action int
    fmt.Println("Enter 1 for Student and 2 for Professional")
    fmt.Scanln(&action)
    /*  Use of Switch Case in  高朗  */   
    switch action {
        case 1:
            fmt.Printf("I am a  Student")
        case 2:
            fmt.Printf("I am a  Professional")
		default:
			panic(fmt.Sprintf("I am a  %d",action))
    }    
    defer func() {
    	action := recover()    	
		fmt.Println(action)			
    }()
}