Skip to content

Instantly share code, notes, and snippets.

@StevenBlack
Created April 30, 2021 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save StevenBlack/d7c2745aa24f348e2773c8067485dc9c to your computer and use it in GitHub Desktop.
Save StevenBlack/d7c2745aa24f348e2773c8067485dc9c to your computer and use it in GitHub Desktop.
Go Try/Catch/Finally implementation
// source: https://play.golang.org/p/LXroobH8SM
package main
import (
"fmt"
)
type Block struct {
Try func()
Catch func(Exception)
Finally func()
}
type Exception interface{}
func Throw(up Exception) {
panic(up)
}
func (tcf Block) Do() {
if tcf.Finally != nil {
defer tcf.Finally()
}
if tcf.Catch != nil {
defer func() {
if r := recover(); r != nil {
tcf.Catch(r)
}
}()
}
tcf.Try()
}
func main() {
fmt.Println("We started")
Block{
Try: func() {
fmt.Println("I tried")
Throw("Oh,...sh...")
},
Catch: func(e Exception) {
fmt.Printf("Caught %v\n", e)
},
Finally: func() {
fmt.Println("Finally...")
},
}.Do()
fmt.Println("We went on")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment