48 lines
889 B
Go
48 lines
889 B
Go
|
package clickhouse
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Exception struct {
|
||
|
Code int32
|
||
|
Name string
|
||
|
Message string
|
||
|
StackTrace string
|
||
|
nested error
|
||
|
}
|
||
|
|
||
|
func (e *Exception) Error() string {
|
||
|
return fmt.Sprintf("code: %d, message: %s", e.Code, e.Message)
|
||
|
}
|
||
|
|
||
|
func (ch *clickhouse) exception() error {
|
||
|
defer ch.conn.Close()
|
||
|
var (
|
||
|
e Exception
|
||
|
err error
|
||
|
hasNested bool
|
||
|
)
|
||
|
if e.Code, err = ch.decoder.Int32(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if e.Name, err = ch.decoder.String(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if e.Message, err = ch.decoder.String(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
e.Message = strings.TrimSpace(strings.TrimPrefix(e.Message, e.Name+":"))
|
||
|
if e.StackTrace, err = ch.decoder.String(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if hasNested, err = ch.decoder.Bool(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if hasNested {
|
||
|
e.nested = ch.exception()
|
||
|
}
|
||
|
return &e
|
||
|
}
|