Как красиво напечатать ошибки Elixir

#elixir #pretty-print

#эликсир #pretty-печать

Вопрос:

Итак, я пытаюсь работать над проектом на основе Elixir. Однако любая ошибка в Elixir выдает не читаемый человеком код ошибки, а вложенные структуры (вложенные в несколько типов скобок) ключей и значений. Трудно различить, что вложено в where . В качестве примера:

 no match of right hand side value: {:ok, %HTTPoison.Response{body: %{"error" => %{"index" => "comments", "index_uuid" => "_na_", "reason" => "no such index [comments]", "resource.id" => "comments", "resource.type" => "index_or_alias", "root_cause" => [%{"index" => "comments", "index_uuid" => "_na_", "reason" => "no such index [comments]", "resource.id" => "comments", "resource.type" => "index_or_alias", "type" => "index_not_found_exception"}], "type" => "index_not_found_exception"}, "status" => 404}, headers: [{"content-type", "application/json; charset=UTF-8"}, {"content-length", "377"}], request: %HTTPoison.Request{body: "{"_source":false,"from":0,"query":{"bool":{"must":{"range":{"posted_at":{"gt":"now-1w"}}},"must_not":[{"terms":{"image_tag_ids":[4,7]}},{"term":{"hidden_from_users":true}}]}},"size":6,"sort":{"posted_at":"desc"},"track_total_hits":true}", headers: [{"Content-Type", "application/json; charset=UTF-8"}], method: :post, options: [], params: %{}, url: "http://elasticsearch:9200/comments/_search"}, request_url: "http://elasticsearch:9200/comments/_search", status_code: 404}}
 

Обратите внимание, что я не спрашиваю об этой ошибке; Я спрашиваю об этом стиле ошибки.

Существует ли стандартный способ «красиво напечатать» ошибку Elixir?

Ответ №1:

Они действительно могут быть трудными для чтения. Но имейте в виду, что возврат полной структуры в ошибке часто делается специально: часто вы можете буквально скопировать и вставить значение iex , например, в сеанс и использовать его для тестирования проблемного кода. Другими словами, ошибки часто предназначены для чтения людьми.

Однако есть пара методов, которые могут быть вам полезны. Первая — это простая функция inspect / 2: она может ограничить размер сообщения и упорядочивает сложные структуры (что может быть очень полезно для ведения журнала). У него есть pretty опция, которая может быть тем, что вам нужно. Есть несколько других вариантов, которые вы можете попробовать.

 inspect(some_error, pretty: true)
 

Другой метод более специфичен: иногда вам приходится «разворачивать» ошибки, чтобы сделать их более удобочитаемыми. Иногда для этого есть помощники (например, Phoenix view-помощники, которые форматируют ошибки Ecto или Ecto.Набор изменений.traverse_errors/2 — это примеры вспомогательных функций, которые помогают сделать ошибки более удобочитаемыми). Не существует «универсальной» формы сообщения об ошибке — они обычно специфичны для конкретного варианта использования.

Наконец, стоит упомянуть, что сопоставление шаблонов, в частности, может помочь вам контролировать поток вашего кода, чтобы вы более тщательно защищали то, что считается успехом или неудачей, и это может помочь вам разобраться в различных типах ошибок.