34 lines
587 B
Go
34 lines
587 B
Go
|
package safe
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
// Run the function safely knowing that if it panics
|
||
|
// the panic will be caught and returned as an error
|
||
|
func Run(fn func()) (err error) {
|
||
|
return RunE(func() error {
|
||
|
fn()
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Run the function safely knowing that if it panics
|
||
|
// the panic will be caught and returned as an error
|
||
|
func RunE(fn func() error) (err error) {
|
||
|
defer func() {
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if ex := recover(); ex != nil {
|
||
|
if e, ok := ex.(error); ok {
|
||
|
err = e
|
||
|
return
|
||
|
}
|
||
|
err = errors.New(fmt.Sprint(ex))
|
||
|
}
|
||
|
}()
|
||
|
return fn()
|
||
|
}
|