On Fri, Aug 4, 2023, 13:57 Harri L <harl...@gmail.com> wrote: > Yes, we can handle Go errors without language changes; that’s true. But > how we should annotate errors? The presented version of CopyFile leads to > following 'stuttering': > cannot copy '/tmpfs/play' to './tmp33/not-exist.txt': cannot create > destination: open ./tmp33/not-exist.txt: no such file or directory > > You will notice there is repeated information, and it is because os.Create adds meaningless context to the error message ("open ./tmp33/not-exist.txt"), file path is owned by caller, and caller should handle its problems. It should be:
cannot copy '/tmpfs/play' to './tmp33/not-exist.txt': cannot create destination: no such file or directory I thinks its pretty easy to read. But if you prefer sed "s/: /\n\n/g": cannot copy '/tmpfs/play' to './tmp33/not-exist.txt' cannot create destination no such file or directory You don't even need a stack trace to know where it failed. If you use pre-declared errors, you can even go further and do some handling programmatically, like "errros.Is(err, Retry)" for retrying without any complicated dependency. You can get compact but informative error messages just by following K&D > annotation rules: > > 1. Annotate the function you are implementing > 2. Let the functions that you are calling do their own job > > copy file: open ./tmp33/not-exist.txt: no such file or directory > > For me (personal opinion), that message is not easy to understand. copy file Is this a log message telling me it is copying some file? or is it an error message? open ./tmp33/not-exist.txt Oh, cool, it was a log message, it is opening a file now, keep it going buddy, you can copy that file :) no such file or directory Well, it is a failure, I guess. But now I don't know where it failed, is that source or destination? With previous message: cannot copy '/tmpfs/play' to './tmp33/not-exist.txt' No! why you do this to me? cannot create destination But WHY!? I have been so nice to you 'not-exist.txt' no such file or directory Oh, you don't even exist haha sorry, drama moment (We would never get that error because os.Create creates the file, but I am using your example) Using specific annotation is a different topic, but the primary goal of this error messages is being hints for developers. For end users you will be probably using translations or anything else. All of this is just basic error propagation, which can be automated to > avoid annoying human errors. You can see three different error annotation > scenarios of the FileCopy implementations in this playground > <https://go.dev/play/p/W9ym0JkLsVF>. > > And the function itself is compact as well — and fully automated (tip: > change the name of the function): > func copyFile(src, dst string) (err error) { defer err2.Handle(&err) r := > try.To1(os.Open(src)) defer r.Close() w := try.To1(os.Create(dst)) defer > err2.Handle(&err, func() { os.Remove(dst) }) defer w.Close() > try.To1(io.Copy(w, r)) return nil } > > Not sure, but this looks like try-catch exceptions in Go. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAF9DLCkGDsDOf9qUqmtux0D55Csc2n6%3DcKw_G9zUJBbSTi3SJA%40mail.gmail.com.