2021-05-20 17:32:35 +08:00
|
|
|
package exceptions
|
|
|
|
|
2021-05-21 09:41:58 +08:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io"
|
2021-05-21 13:31:41 +08:00
|
|
|
"os"
|
2021-05-21 11:14:07 +08:00
|
|
|
"strings"
|
2021-05-21 09:41:58 +08:00
|
|
|
)
|
2021-05-20 17:32:35 +08:00
|
|
|
|
|
|
|
type Exception interface {
|
2021-05-21 11:14:07 +08:00
|
|
|
Cause() Exception
|
2021-05-20 17:32:35 +08:00
|
|
|
Error() string
|
2022-03-30 20:49:59 +08:00
|
|
|
ErrorMessage() string
|
2021-05-20 17:32:35 +08:00
|
|
|
StackTrace() []StackTrace
|
|
|
|
PrintStackTrace()
|
|
|
|
PrintStackTraceTo(writer io.Writer)
|
2021-05-21 11:14:07 +08:00
|
|
|
BuildPrintStackTrace(builder *strings.Builder)
|
2021-05-20 17:32:35 +08:00
|
|
|
}
|
2021-05-21 09:41:58 +08:00
|
|
|
|
2021-05-21 13:31:41 +08:00
|
|
|
func PrintStackTraceByArray(writer io.Writer, trace []StackTrace) {
|
|
|
|
if trace == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
builder := &strings.Builder{}
|
|
|
|
for _, stackTrace := range trace {
|
|
|
|
stackTrace.WriteTo(builder)
|
|
|
|
}
|
|
|
|
bytes := []byte(builder.String())
|
|
|
|
writeBytes := 0
|
|
|
|
for writeBytes < len(bytes) {
|
|
|
|
write, err := writer.Write(bytes[writeBytes:])
|
|
|
|
if err != nil {
|
|
|
|
Print(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
writeBytes += write
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BuildStackTraceByArray(builder *strings.Builder, trace []StackTrace) {
|
|
|
|
if trace == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, stackTrace := range trace {
|
|
|
|
stackTrace.WriteTo(builder)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func BuildStackTrace(builder *strings.Builder, e Exception, exceptionMsg string) {
|
2022-03-30 20:49:59 +08:00
|
|
|
builder.WriteString(fmt.Sprintln(exceptionMsg, e.ErrorMessage()))
|
2021-05-21 09:41:58 +08:00
|
|
|
if e.StackTrace() == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, stackTrace := range e.StackTrace() {
|
2021-05-21 11:14:07 +08:00
|
|
|
stackTrace.WriteTo(builder)
|
2021-05-21 09:41:58 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-21 11:58:21 +08:00
|
|
|
func Try[R any](
|
|
|
|
f func() (ret R, err Exception),
|
2022-03-23 10:15:18 +08:00
|
|
|
catch func(panic any) (ret R, err Exception),
|
2022-03-21 11:58:21 +08:00
|
|
|
) (ret R, err Exception) {
|
2021-05-21 09:41:58 +08:00
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
2021-05-21 10:31:49 +08:00
|
|
|
ret, err = catch(r)
|
2021-05-21 09:41:58 +08:00
|
|
|
}
|
|
|
|
}()
|
2021-05-21 10:31:49 +08:00
|
|
|
ret, err = f()
|
2021-05-21 09:41:58 +08:00
|
|
|
if err != nil {
|
2021-05-21 10:31:49 +08:00
|
|
|
ret, err = catch(err)
|
2021-05-21 09:41:58 +08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2021-05-21 13:31:41 +08:00
|
|
|
|
|
|
|
func Print(err error) {
|
|
|
|
if err == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
switch err.(type) {
|
|
|
|
case Exception:
|
|
|
|
err.(Exception).PrintStackTrace()
|
|
|
|
default:
|
|
|
|
_, _ = fmt.Fprintln(os.Stderr, err)
|
2021-05-21 13:52:31 +08:00
|
|
|
PrintStackTraceByArray(os.Stderr, GetStackTrace())
|
2021-05-21 13:31:41 +08:00
|
|
|
}
|
|
|
|
}
|
2021-05-21 14:48:42 +08:00
|
|
|
|
|
|
|
func Package(err error) Exception {
|
|
|
|
if err == nil {
|
|
|
|
return nil
|
|
|
|
}
|
2021-05-21 16:03:26 +08:00
|
|
|
switch err.(type) {
|
|
|
|
case Exception:
|
|
|
|
return err.(Exception)
|
|
|
|
}
|
2022-03-21 11:02:41 +08:00
|
|
|
return NewRuntimeException(err, "", DefaultExceptionConfig().SetCause(err))
|
2021-05-21 14:48:42 +08:00
|
|
|
}
|
2021-05-21 16:03:26 +08:00
|
|
|
|
2022-03-23 10:15:18 +08:00
|
|
|
func PackageAny(err any) Exception {
|
2021-05-21 16:03:26 +08:00
|
|
|
if err == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
switch err.(type) {
|
|
|
|
case error:
|
|
|
|
return Package(err.(error))
|
|
|
|
default:
|
2022-03-21 11:02:41 +08:00
|
|
|
return NewRuntimeException(err, "", DefaultExceptionConfig())
|
2021-05-21 16:03:26 +08:00
|
|
|
}
|
|
|
|
}
|
2021-07-05 15:51:53 +08:00
|
|
|
|
2022-03-23 10:15:18 +08:00
|
|
|
func PackagePanic(panic any, exceptionMessage string) Exception {
|
2021-07-05 15:53:46 +08:00
|
|
|
if panic == nil {
|
|
|
|
return nil
|
|
|
|
}
|
2021-07-05 15:51:53 +08:00
|
|
|
switch panic.(type) {
|
|
|
|
case error:
|
|
|
|
return NewRuntimeException(
|
|
|
|
panic,
|
2021-07-06 13:16:10 +08:00
|
|
|
exceptionMessage,
|
2022-03-21 11:02:41 +08:00
|
|
|
DefaultExceptionConfig().SetCause(panic),
|
2021-07-05 15:51:53 +08:00
|
|
|
)
|
|
|
|
default:
|
|
|
|
return NewRuntimeException(
|
|
|
|
panic,
|
2021-07-06 13:16:10 +08:00
|
|
|
exceptionMessage,
|
2022-03-21 11:02:41 +08:00
|
|
|
DefaultExceptionConfig(),
|
2021-07-05 15:51:53 +08:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|