1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use crate::prelude::internal::*;
pub fn set_panic_hook() {
// When the `console_error_panic_hook` feature is enabled, we can call the
// `set_panic_hook` function at least once during initialization, and then
// we will get better error messages if our code ever panics.
//
// For more details see
// https://github.com/rustwasm/console_error_panic_hook#readme
#[cfg(feature = "console_error_panic_hook")]
console_error_panic_hook::set_once();
}
pub fn js_error_to_string(value: JsValue) -> String {
// Handle `throw new Error("message")`
if let Some(error) = value.dyn_ref::<js_sys::Error>() {
let message: String = error.message().into();
let stack = Reflect::get(&value, &JsValue::from_str("stack"))
.ok()
.and_then(|stack| stack.as_string());
return match stack {
Some(stack) if !stack.is_empty() => stack,
_ => message,
};
}
// Handle `throw "message"`
if let Some(string) = value.as_string() {
return string;
}
// Handle custom objects with `.message`
if let Ok(message) = Reflect::get(&value, &JsValue::from_str("message"))
&& let Some(message) = message.as_string()
{
return message;
}
// Fallback equivalent-ish to JS `String(value)`
js_sys::JsString::from(value).into()
}