mirror of
https://gitee.com/johng/gf.git
synced 2024-12-02 04:07:47 +08:00
53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||
|
//
|
||
|
// This Source Code Form is subject to the terms of the MIT License.
|
||
|
// If a copy of the MIT was not distributed with this file,
|
||
|
// You can obtain one at https://github.com/gogf/gf.
|
||
|
|
||
|
package gutil
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/gogf/gf/v2/errors/gcode"
|
||
|
"github.com/gogf/gf/v2/errors/gerror"
|
||
|
)
|
||
|
|
||
|
// Throw throws out an exception, which can be caught be TryCatch or recover.
|
||
|
func Throw(exception interface{}) {
|
||
|
panic(exception)
|
||
|
}
|
||
|
|
||
|
// Try implements try... logistics using internal panic...recover.
|
||
|
// It returns error if any exception occurs, or else it returns nil.
|
||
|
func Try(ctx context.Context, try func(ctx context.Context)) (err error) {
|
||
|
if try == nil {
|
||
|
return
|
||
|
}
|
||
|
defer func() {
|
||
|
if exception := recover(); exception != nil {
|
||
|
if v, ok := exception.(error); ok && gerror.HasStack(v) {
|
||
|
err = v
|
||
|
} else {
|
||
|
err = gerror.NewCodef(gcode.CodeInternalPanic, "%+v", exception)
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
try(ctx)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// TryCatch implements `try...catch..`. logistics using internal `panic...recover`.
|
||
|
// It automatically calls function `catch` if any exception occurs and passes the exception as an error.
|
||
|
// If `catch` is given nil, it ignores the panic from `try` and no panic will throw to parent goroutine.
|
||
|
//
|
||
|
// But, note that, if function `catch` also throws panic, the current goroutine will panic.
|
||
|
func TryCatch(ctx context.Context, try func(ctx context.Context), catch func(ctx context.Context, exception error)) {
|
||
|
if try == nil {
|
||
|
return
|
||
|
}
|
||
|
if exception := Try(ctx, try); exception != nil && catch != nil {
|
||
|
catch(ctx, exception)
|
||
|
}
|
||
|
}
|