Skip to content

Error Handling

Dave Liepmann edited this page Feb 28, 2018 · 31 revisions

Philosophy

Maria provides a safe playground for experimentation. Therefore, errors of all sorts must be caught and translated into humane, beginner-friendly language. These errors should be worded gently and should suggest ways to solve the error.

Those interested in how Maria wraps errors should read src/maria/messages.cljs and related namespaces. πŸ€“ πŸ‘πŸΎ

πŸ˜‡ Specific errors we could handle better πŸ˜‡

When it comes to the fight against opaque error messages, we are stronger together. πŸ’ͺ🏾 Please feel free to add to this list!

"illegal character" when naming something with emoji

Trying to name a var using an emoji causes "illegal character":

(def keysπŸ”‘ ["πŸ”‘" "🎹" "πŸ—"])
> illegal character

See #170 https://github.com/mhuebert/maria/issues/170

More explanation of wrongly typed argument

(circle "puppy")

radius must be a number!

Ideally we'd say more here, and use syntax highlighting. Maybe something like

Argument radius has to be a number. The function circle can't use "puppy" because it is a string.

Accidentally using single quotes rather than double quotes

expressions with single-quoted terms, like (circle 'hello') slip through undeclared-var detection and result in "invalid is too many arguments!"

  • M: looks like ' is a valid character inside a symbol, so errors will be unpredictable -- caused by passing a symbol where something else is expected. We could try and generate a warning whenever a symbol ends in ' (maybe we can do this check in the magic-tree read or emit phase, otherwise we have to traverse every form). Or combine better overall argument validation (eg. more clojure.spec) with a hook at the end which checks invalid args for patterns like this.

Undetected misuse of function as integer

(inc dec) causes ""function cljs$core$dec(x){\nreturn (x - (1));\n}1""

  • M: no runtime validation of args. maybe using clojure.spec with instrument can help - added #71.

Wrong order of args in HOF causes no response

See https://github.com/yogthos/clojure-error-message-catalog/blob/master/clj/dont-know-how-to-create-iseq-from.md

(map [1 2 3] inc) causes console error 😿, no result 😿, and a broken environment. πŸ’©!

  • M: lazy seqs... we should be catching errors in format-value, and pass them to our error code, as lazy seqs do not realize until rendered, and even then only one slice at a time. Added #70.

We don't detect misuse of keyword lookups

(:a "B") causes "nil" output, even though we'd like to detect attempted use of key lookups on non-maps and suggest alternatives. See https://github.com/yogthos/clojure-error-message-catalog/blob/master/clj/wrong-num-args-passed-to-keyword.md

Similarly, (:first-name "Bob", :last-name "Bobberton") causes "(intermediate value).cljs$core$IFn$_invoke$arity$3 is not a function\n\nThe function first-name in the expression above needs a different number of arguments.""

Destructuring errors

(defn destructure-fn [[a b] num] a) then (destructure-fn 3 [1 2]) causes "nth not supported on this type function Number() { [native code] }"

We should catch the attempt to destructure and point to it as a possible cause when this error occurs. See https://github.com/yogthos/clojure-error-message-catalog/blob/master/clj/nth-not-supported-on-this-type.md

  • M: not sure if we can make sense of this without moving down the stack and showing the location in the destructuring form where the mismatch is occurring. In general, traversing the stack with source lookup and location underline would be a nice thing to have.

Completed

Multiple overloads of a function with the same arity

See https://github.com/yogthos/clojure-error-message-catalog/blob/master/cljs/duplicate-case-test-constant.md for an overview of the error.

We currently catch and reword the initial error, but that is only one-third of the total error message. We still are getting an unwanted follow-up looking like:

Duplicate case test constant '1' on line 1  at line 1 

Error: Duplicate case test constant '1' on line 1  at line 1 
    at new cljs$core$ExceptionInfo (http://localhost:3449/js/compiled/out-user-dev/cljs/core.js:35636:10)
    at Function.cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 (http://localhost:3449/js/compiled/out-user-dev/cljs/core.js:35712:9)
    at cljs$core$ex_info (http://localhost:3449/js/compiled/out-user-dev/cljs/core.js:35698:26)
    at Function.cljs.analyzer.error.cljs$core$IFn$_invoke$arity$3 (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:1073:26)
    at cljs$analyzer$error (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:1059:28)
    at cljs$analyzer$macroexpand_1 (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:5291:27)
    at Function.cljs.analyzer.analyze_seq.cljs$core$IFn$_invoke$arity$4 (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:5365:41)
    at cljs$analyzer$analyze_seq (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:5337:34)
    at cljs$analyzer$analyze_form (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:5508:34)
    at cljs$analyzer$analyze_STAR_ (http://localhost:3449/js/compiled/out-user-dev/cljs/analyzer.js:5549:38)
{:type :overload-arity, :extra {:name twice}}

Even number of forms in let

We misreport the cause of this. See https://github.com/yogthos/clojure-error-message-catalog/blob/master/clj/let-requires-even-number-forms.md

  • M: looks like all "Could not compile" errors are currently interpreted as 'It looks like you're declaring a function' which is getting in the way.

"Index out of bounds"

(nth '(1 2 3) 20)
Clone this wiki locally