Skip to content

make better usage of error value in catch block#8460

Merged
rgwood merged 6 commits intonushell:mainfrom
WindSoilder:err_in_catch
Mar 16, 2023
Merged

make better usage of error value in catch block#8460
rgwood merged 6 commits intonushell:mainfrom
WindSoilder:err_in_catch

Conversation

@WindSoilder
Copy link
Copy Markdown
Contributor

Description

Fixes: #8402 #8391

The cause of these issue if when we want to evaluate a expression with Value::Error, nushell show error immediately. To fix the issue, we can wrap the Value::Error into a Value::Record. So user can see the message he want.

User-Facing Changes

Before

❯ try { 1 / 0 } catch {|e| echo $"error is ($e)"}
Error: nu::shell::division_by_zero

  × Division by zero.
   ╭─[entry #2:1:1]
 1 │ try { 1 / 0 } catch {|e| echo $"error is ($e)"}
   ·         ┬
   ·         ╰── division by zero
   ╰────

After

❯ try { 1 / 0 } catch {|e| echo $"error is ($e)"}
error is {msg: Division by zero., debug: DivisionByZero { span: Span { start: 43104, end: 43105 } }, raw: DivisionByZero { sp
an: Span { start: 43104, end: 43105 } }}

As we can see, error becomes a record with msg, debug, raw columns.

  1. msg column is a user friendly message.
  2. debug column is more about Value::Error information as a string.
  3. raw column is a Value::Error itself, if user want to re-raise the error, just use $e | get raw

Tests + Formatting

Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

  • cargo fmt --all -- --check to check standard code formatting (cargo fmt --all applies these changes)
  • cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect to check that you're using the standard code style
  • cargo test --workspace to check that all tests pass

Note
from nushell you can also use the toolkit as follows

use toolkit.nu  # or use an `env_change` hook to activate it automatically
toolkit check pr

After Submitting

If your PR had any user-facing changes, update the documentation after the PR is merged, if necessary. This will help us keep the docs up to date.

@WindSoilder WindSoilder changed the title make better usage of error value in catch block make better usage of error value in catch block Mar 15, 2023
@codecov
Copy link
Copy Markdown

codecov bot commented Mar 15, 2023

Codecov Report

Merging #8460 (c95bd64) into main (c7583ec) will decrease coverage by 0.01%.
The diff coverage is 86.66%.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #8460      +/-   ##
==========================================
- Coverage   68.13%   68.12%   -0.01%     
==========================================
  Files         620      620              
  Lines       99723    99733      +10     
==========================================
- Hits        67950    67947       -3     
- Misses      31773    31786      +13     
Impacted Files Coverage Δ
crates/nu-cmd-lang/src/core_commands/try_.rs 94.64% <86.66%> (+2.26%) ⬆️

... and 3 files with indirect coverage changes

Copy link
Copy Markdown
Contributor

@rgwood rgwood left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool! This looks great from a user-facing perspective.

Converting errors into records feels a little hacky; it would be nice if we were able to pass around errors as data. But I think that would be a lot of work, this approach seems like a practical step forward for now.

@WindSoilder
Copy link
Copy Markdown
Contributor Author

it would be nice if we were able to pass around errors as data.

Sadly I've tried it, but it breaks many things. Currently when nushell meets Value::Error, it'll raise out ShellError, it's important for many commands which supports operating on specific cell paths

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cant report an error encountered in a try closure from the catch closure

2 participants