The reason for error handling is to prevent program errors that the compiler does not notice.
Then you need to set two things.
1) How to set the error value?
2) How to output and handle error conditions?
type error interface {
Error() string
}
func (e *errorString) Error() string {
return e.s
}
type errorString struct {
s string
}
func New(text string) error {
return &errorString(text)
}
func findSC(name, server string, c chan int) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Minute)
//return security clearance from map
c <- scMapping[name]
}
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Minute)
if v, ok := scMapping[name]; !ok {
return -1, errors.New("Crew member not found")
} else {
return v, nil
}
}
if false {
fmt.Println("False")
} else {
fmt.Println("True")
}
True
func main() {
rand.Seed(time.Now().UnixNano())
c1 := make(chan int)
c2 := make(chan int)
name := "James"
go findSC(name, "Server 1", c1)
go findSC(name, "Server 2", c2)
select {
case sc := <-c1:
fmt.Println(name, "has a security clearance of ", sc, "found in server1 ")
case sc := <-c2:
fmt.Println(name, "has a security clearance of ", sc, "found in server2 ")
case <-time.After(1 * time.Millisecond):
fmt.Println("Search timed out!!")
}
}
func main() {
rand.Seed(time.Now().UnixNano())
clearance, err := findSC("Ruko", "Server 1")
fmt.Println(" Clearance level found:", clearance, "Error code", err)
}
Clearance level found: -1 Error code Crew member not found
func main() {
rand.Seed(time.Now().UnixNano())
if clearance, err := findSC("Ruko", "Server 1"); err != nil {
fmt.Println("Error occured while searching for cleanrance level", err)
} else {
fmt.Println("Clearance level found:", clearance)
}
}
var ErrCrewNotFound = errors.New("Crew member not found")
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
if v, ok := scMapping[name]; !ok {
return -1, errors.New("Crew member not found")
} else {
return v, nil
}
}
func main() {
rand.Seed(time.Now().UnixNano())
if clearance, err := findSC("Ruko", "Server 1"); err != nil {
fmt.Println("Error occured while searching for cleanrance level", err)
} else {
fmt.Println("Clearance level found:", clearance)
}
}
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
if v, ok := scMapping[name]; !ok {
return -1, ErrCrewNotFound
} else {
return v, nil
}
}
func main() {
rand.Seed(time.Now().UnixNano())
clearance, err := findSC("Ruko", "Server 1")
if err == ErrCrewNotFound{
//handle the error
fmt.Println("Confirmed error is crew not found!!")
}
}
func Errorf(format string, a ...interface{}) error {
return errors.New(Sprintf(format, a...))
}
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
if v, ok := scMapping[name]; !ok {
return -1, fmt.Errorf("Crew member %s could not be found on server '%s'", name, server)
} else {
return v, nil
}
}
func main() {
rand.Seed(time.Now().UnixNano())
if clearance, err := findSC("Ruko", "Server 1"); err != nil {
fmt.Println("Error occured:", err)
} else {
fmt.Println("Clearance level found:", clearance)
}
}
Error occured: Crew member Ruko could not be found on server 'Server 1'
type findError struct {
Name, Server, Msg string
}
func (e findError) Error() string {
return e.Msg
}
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
if v, ok := scMapping[name]; !ok {
return -1, findError{name, server, "Crew member not found"}
} else {
return v, nil
}
}
func main() {
rand.Seed(time.Now().UnixNano())
if clearance, err := findSC("Ruko", "Server 1"); err != nil {
fmt.Println("Error occured while searching ", err)
if v, ok := err.(findError); ok {
fmt.Println("Server name", v.Server)
fmt.Println("Crew member name", v.Name)
}
} else {
fmt.Println("Crew member has security clearance:", clearance)
}
}
Error occured while searching Crew member not found
Server name Server 1
Crew member name Ruko
func findSC(name, server string) (int, error) {
//Simulate searching
time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond))
if v, ok := scMapping[name]; !ok {
panic("Crew member not found")
} else {
return v, nil
}
}
-You can invoke a panic by simply using the key word panic with a string pass as shown.
panic: Crew member not found
goroutine 1 [running]:
main.findSC({0x7a6e11, 0x4}, {0x55, 0x2547d93bb00})
C:/Go/Learngo/Udemy/main.go:30 +0x8d
main.main()
C://Learngo/Udemy/main.go:44 +0xb1
exit status 2
-It is due to the fact that we haven't recovered from the panic inside our code.
defer func() {
if err := recover(); err != nil {
fmt.Println("A panic recovered", err)
}
}()
A panic recovered Crew member not found