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  }