Struct boa_engine::error::JsError

source ·
pub struct JsError { /* private fields */ }
Expand description

The error type returned by all operations related to the execution of Javascript code.

This is essentially an enum that can store either JsNativeErrors (for ideal native errors) or opaque JsValues, since Javascript allows throwing any valid JsValue.

The implementation doesn’t provide a From conversion for JsValue. This is with the intent of encouraging the usage of proper JsNativeErrors instead of plain JsValues. However, if you do need a proper opaque error, you can construct one using the JsError::from_opaque method.

§Examples

let cause = JsError::from_opaque(js_string!("error!").into());

assert!(cause.as_opaque().is_some());
assert_eq!(cause.as_opaque().unwrap(), &JsValue::from(js_string!("error!")));

let native_error: JsError = JsNativeError::typ()
    .with_message("invalid type!")
    .with_cause(cause)
    .into();

assert!(native_error.as_native().is_some());

let kind = &native_error.as_native().unwrap().kind;
assert!(matches!(kind, JsNativeErrorKind::Type));

Implementations§

source§

impl JsError

source

pub const fn from_native(err: JsNativeError) -> Self

Creates a new JsError from a native error err.

§Examples
let error = JsError::from_native(JsNativeError::syntax());

assert!(error.as_native().is_some());
source

pub const fn from_opaque(value: JsValue) -> Self

Creates a new JsError from an opaque error value.

§Examples
let error = JsError::from_opaque(5.0f64.into());

assert!(error.as_opaque().is_some());
source

pub fn to_opaque(&self, context: &mut Context) -> JsValue

Converts the error to an opaque JsValue error

Unwraps the inner JsValue if the error is already an opaque error.

§Examples
let context = &mut Context::default();
let error: JsError =
    JsNativeError::eval().with_message("invalid script").into();
let error_val = error.to_opaque(context);

assert!(error_val.as_object().unwrap().is::<ErrorObject>());
source

pub fn try_native( &self, context: &mut Context ) -> Result<JsNativeError, TryNativeError>

Unwraps the inner error if this contains a native error. Otherwise, inspects the opaque error and tries to extract the necessary information to construct a native error similar to the provided opaque error. If the conversion fails, returns a TryNativeError with the cause of the failure.

§Note 1

This method won’t try to make any conversions between JS types. In other words, for this conversion to succeed:

  • message MUST be a JsString value.
  • errors (in the case of AggregateErrors) MUST be an Array object.
§Note 2

This operation should be considered a lossy conversion, since it won’t store any additional properties of the opaque error, other than message, cause and errors (in the case of AggregateErrors). If you cannot affort a lossy conversion, clone the object before calling from_opaque to preserve its original properties.

§Examples
let context = &mut Context::default();

// create a new, opaque Error object
let error: JsError = JsNativeError::typ().with_message("type error!").into();
let error_val = error.to_opaque(context);

// then, try to recover the original
let error = JsError::from_opaque(error_val).try_native(context).unwrap();

assert!(matches!(error.kind, JsNativeErrorKind::Type));
assert_eq!(error.message(), "type error!");
source

pub const fn as_opaque(&self) -> Option<&JsValue>

Gets the inner JsValue if the error is an opaque error, or None otherwise.

§Examples
let error: JsError = JsNativeError::reference()
    .with_message("variable not found!")
    .into();

assert!(error.as_opaque().is_none());

let error = JsError::from_opaque(256u32.into());

assert!(error.as_opaque().is_some());
source

pub const fn as_native(&self) -> Option<&JsNativeError>

Gets the inner JsNativeError if the error is a native error, or None otherwise.

§Examples
let error: JsError =
    JsNativeError::error().with_message("Unknown error").into();

assert!(error.as_native().is_some());

let error = JsError::from_opaque(JsValue::undefined().into());

assert!(error.as_native().is_none());
source

pub fn into_erased(self, context: &mut Context) -> JsErasedError

Converts this error into its thread-safe, erased version.

Even though this operation is lossy, converting into a JsErasedError is useful since it implements Send and Sync, making it compatible with error reporting frameworks such as anyhow, eyre or miette.

§Examples
let context = &mut Context::default();
let cause = JsError::from_opaque(JsSymbol::new(Some(js_string!("error!"))).unwrap().into());

let native_error: JsError = JsNativeError::typ()
    .with_message("invalid type!")
    .with_cause(cause)
    .into();

let erased_error = native_error.into_erased(context);

assert_eq!(erased_error.to_string(), "TypeError: invalid type!");

let send_sync_error: Box<dyn Error + Send + Sync> = Box::new(erased_error);

assert_eq!(
    send_sync_error.source().unwrap().to_string(),
    "Symbol(error!)"
);

Trait Implementations§

source§

impl Clone for JsError

source§

fn clone(&self) -> JsError

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JsError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for JsError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for JsError

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl Finalize for JsError

source§

fn finalize(&self)

Cleanup logic for a type.
source§

impl From<Error> for JsError

source§

fn from(err: Error) -> Self

Converts to this type from the input type.
source§

impl From<JsNativeError> for JsError

source§

fn from(error: JsNativeError) -> Self

Converts to this type from the input type.
source§

impl PartialEq for JsError

source§

fn eq(&self, other: &JsError) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Trace for JsError

source§

unsafe fn trace(&self, tracer: &mut Tracer)

Marks all contained Gcs. Read more
source§

unsafe fn trace_non_roots(&self)

Trace handles located in GC heap, and mark them as non root. Read more
source§

fn run_finalizer(&self)

Runs Finalize::finalize on this object and all contained subobjects.
source§

impl Eq for JsError

source§

impl StructuralPartialEq for JsError

Auto Trait Implementations§

§

impl !RefUnwindSafe for JsError

§

impl !Send for JsError

§

impl !Sync for JsError

§

impl Unpin for JsError

§

impl !UnwindSafe for JsError

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Pipe for T
where T: ?Sized,

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSendSync for T