github.com/tursom/GoCollections@v0.3.10/lang/Exception.go (about) 1 /* 2 * Copyright (c) 2022 tursom. All rights reserved. 3 * Use of this source code is governed by a GPL-3 4 * license that can be found in the LICENSE file. 5 */ 6 7 package lang 8 9 import ( 10 "fmt" 11 "io" 12 "os" 13 "strings" 14 ) 15 16 type Exception interface { 17 Cause() Exception 18 Error() string 19 Name() string 20 Message() string 21 StackTrace() []StackTrace 22 PrintStackTrace() 23 PrintStackTraceTo(writer io.Writer) 24 BuildPrintStackTrace(builder *strings.Builder) 25 } 26 27 func PrintStackTraceByArray(writer io.Writer, trace []StackTrace) { 28 if trace == nil { 29 return 30 } 31 builder := &strings.Builder{} 32 for _, stackTrace := range trace { 33 stackTrace.WriteTo(builder) 34 } 35 bytes := []byte(builder.String()) 36 writeBytes := 0 37 for writeBytes < len(bytes) { 38 write, err := writer.Write(bytes[writeBytes:]) 39 if err != nil { 40 Print(err) 41 return 42 } 43 writeBytes += write 44 } 45 } 46 47 func BuildStackTraceByArray(builder *strings.Builder, trace []StackTrace) { 48 if trace == nil { 49 return 50 } 51 for _, stackTrace := range trace { 52 stackTrace.WriteTo(builder) 53 } 54 } 55 56 func BuildStackTrace(builder *strings.Builder, e Exception) { 57 builder.WriteString(e.Error()) 58 builder.WriteString("\n") 59 if e.StackTrace() == nil { 60 return 61 } 62 for _, stackTrace := range e.StackTrace() { 63 stackTrace.WriteTo(builder) 64 } 65 } 66 67 func GetStackTraceString(e Exception) string { 68 builder := &strings.Builder{} 69 BuildStackTrace(builder, e) 70 return builder.String() 71 } 72 73 func Try[R any]( 74 f func() (ret R, err Exception), 75 catch func(panic any) (ret R, err Exception), 76 ) (ret R, err Exception) { 77 defer func() { 78 if r := recover(); r != nil { 79 ret, err = catch(r) 80 } 81 }() 82 ret, err = f() 83 if err != nil { 84 ret, err = catch(err) 85 } 86 return 87 } 88 89 func Print(err error) { 90 if err == nil { 91 return 92 } 93 switch err.(type) { 94 case Exception: 95 err.(Exception).PrintStackTrace() 96 default: 97 _, _ = fmt.Fprintln(os.Stderr, err) 98 PrintStackTraceByArray(os.Stderr, GetStackTrace()) 99 } 100 }