зеркало из https://github.com/CryptoPro/go.git
46 строки
873 B
Go
46 строки
873 B
Go
|
// run
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"runtime/debug"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Inner struct {
|
||
|
Err int
|
||
|
}
|
||
|
|
||
|
func (i *Inner) NotExpectedInStackTrace() int {
|
||
|
if i == nil {
|
||
|
return 86
|
||
|
}
|
||
|
return 17 + i.Err
|
||
|
}
|
||
|
|
||
|
type Outer struct {
|
||
|
Inner
|
||
|
}
|
||
|
|
||
|
func ExpectedInStackTrace() {
|
||
|
var o *Outer
|
||
|
println(o.NotExpectedInStackTrace())
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
defer func() {
|
||
|
if r := recover(); r != nil {
|
||
|
stacktrace := string(debug.Stack())
|
||
|
if strings.Contains(stacktrace, "NotExpectedInStackTrace") {
|
||
|
fmt.Println("FAIL, stacktrace contains NotExpectedInStackTrace")
|
||
|
}
|
||
|
if !strings.Contains(stacktrace, "ExpectedInStackTrace") {
|
||
|
fmt.Println("FAIL, stacktrace does not contain ExpectedInStackTrace")
|
||
|
}
|
||
|
} else {
|
||
|
fmt.Println("FAIL, should have panicked but did not")
|
||
|
}
|
||
|
}()
|
||
|
ExpectedInStackTrace()
|
||
|
}
|