GoCollections/exceptions/Exception.go

129 lines
2.4 KiB
Go
Raw Normal View History

2022-11-25 18:19:33 +08:00
/*
* Copyright (c) 2022 tursom. All rights reserved.
* Use of this source code is governed by a GPL-3
* license that can be found in the LICENSE file.
*/
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"
2022-11-26 13:42:30 +08:00
"github.com/tursom/GoCollections/lang"
2021-05-21 09:41:58 +08:00
)
2021-05-20 17:32:35 +08:00
type Exception = lang.Exception
2021-05-21 09:41:58 +08:00
2022-11-26 13:42:30 +08:00
func PrintStackTraceByArray(writer io.Writer, trace []lang.StackTrace) {
2021-05-21 13:31:41 +08:00
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
}
}
2022-11-26 13:42:30 +08:00
func BuildStackTraceByArray(builder *strings.Builder, trace []lang.StackTrace) {
2021-05-21 13:31:41 +08:00
if trace == nil {
return
}
for _, stackTrace := range trace {
stackTrace.WriteTo(builder)
}
}
2022-03-31 01:22:30 +08:00
func BuildStackTrace(builder *strings.Builder, e Exception) {
2022-04-02 15:25:35 +08:00
builder.WriteString(e.Error())
builder.WriteString("\n")
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-07-11 17:36:48 +08:00
func GetStackTraceString(e Exception) string {
builder := &strings.Builder{}
BuildStackTrace(builder, e)
return builder.String()
}
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)
2022-11-26 13:42:30 +08:00
PrintStackTraceByArray(os.Stderr, lang.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-31 01:22:30 +08:00
return NewRuntimeException("", 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-31 01:22:30 +08:00
return NewRuntimeException("", 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:
2022-04-23 11:53:41 +08:00
return NewRuntimeException(exceptionMessage, DefaultExceptionConfig().SetCause(panic))
2021-07-05 15:51:53 +08:00
default:
2022-04-23 11:53:41 +08:00
return NewPackageException(panic, nil)
2021-07-05 15:51:53 +08:00
}
}