errors.go (2164B)
1 // Copyright 2018 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 // Package herrors contains common Hugo errors and error related utilities. 15 package herrors 16 17 import ( 18 "bytes" 19 "errors" 20 "fmt" 21 "io" 22 "runtime" 23 "runtime/debug" 24 "strconv" 25 ) 26 27 // PrintStackTrace prints the current stacktrace to w. 28 func PrintStackTrace(w io.Writer) { 29 buf := make([]byte, 1<<16) 30 runtime.Stack(buf, true) 31 fmt.Fprintf(w, "%s", buf) 32 } 33 34 // ErrorSender is a, typically, non-blocking error handler. 35 type ErrorSender interface { 36 SendError(err error) 37 } 38 39 // Recover is a helper function that can be used to capture panics. 40 // Put this at the top of a method/function that crashes in a template: 41 // defer herrors.Recover() 42 func Recover(args ...any) { 43 if r := recover(); r != nil { 44 fmt.Println("ERR:", r) 45 args = append(args, "stacktrace from panic: \n"+string(debug.Stack()), "\n") 46 fmt.Println(args...) 47 } 48 } 49 50 // Get the current goroutine id. Used only for debugging. 51 func GetGID() uint64 { 52 b := make([]byte, 64) 53 b = b[:runtime.Stack(b, false)] 54 b = bytes.TrimPrefix(b, []byte("goroutine ")) 55 b = b[:bytes.IndexByte(b, ' ')] 56 n, _ := strconv.ParseUint(string(b), 10, 64) 57 return n 58 } 59 60 // ErrFeatureNotAvailable denotes that a feature is unavailable. 61 // 62 // We will, at least to begin with, make some Hugo features (SCSS with libsass) optional, 63 // and this error is used to signal those situations. 64 var ErrFeatureNotAvailable = errors.New("this feature is not available in your current Hugo version, see https://goo.gl/YMrWcn for more information") 65 66 // Must panics if err != nil. 67 func Must(err error) { 68 if err != nil { 69 panic(err) 70 } 71 }