| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // Package common provides common utility functions for error handling, formatting, and multi-error management.
- package common
- import (
- "errors"
- "fmt"
- "runtime/debug"
- "github.com/mhsanaei/3x-ui/v3/internal/logger"
- )
- // NewErrorf creates a new error with formatted message.
- func NewErrorf(format string, a ...any) error {
- msg := fmt.Sprintf(format, a...)
- return errors.New(msg)
- }
- // NewError creates a new error from the given arguments.
- func NewError(a ...any) error {
- msg := fmt.Sprintln(a...)
- return errors.New(msg)
- }
- // Recover handles panic recovery and logs the panic error if a message is provided.
- func Recover(msg string) any {
- panicErr := recover()
- if panicErr != nil {
- if msg != "" {
- logger.Error(msg, "panic:", panicErr)
- }
- }
- return panicErr
- }
- // GoRecover runs fn in a new goroutine guarded by a recover, so a panic in a
- // background goroutine is logged (with name and a stack trace) instead of taking
- // the whole process down. name identifies the goroutine in the log.
- func GoRecover(name string, fn func()) {
- go func() {
- defer func() {
- if r := recover(); r != nil {
- logger.Error("panic in goroutine", name, ":", r, "\n"+string(debug.Stack()))
- }
- }()
- fn()
- }()
- }
|