错误消息被记录为 React 元素 $$typeof: Symbol(react.element)

问题描述 投票:0回答:1

我只是尝试使用

throw new Error("message")
显示自定义错误消息。我在控制台中得到的只是这个

{$$typeof: Symbol(react.element), type: 'p', key: null, ref: null, props: {…}, …}

这是我正在使用的代码

注意 -

query
设置为发送错误的输入以获得错误

export default function App() {

  const [movies, setMovies] = useState([]);
  const [watched, setWatched] = useState([]);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState("");
  const query = "hgjhgh";

  useEffect(function () {
    async function fetchMovies() {
      try {
        setIsLoading(true);
        const res = await fetch(
          http://www.omdbapi.com/?i=tt3896198&apikey=${KEY}&s=${query}
        );
        if (!res.ok) {
          throw new Error("Something went wrong with fetching movies");
        }
        const data = await res.json();
        if (data.Response === "False") {
          throw new Error("Movie not found");
        }
        setMovies(data.Search);
      } catch (err) {
        console.log(err);
        setError(err.message);
      } finally {
        setIsLoading(false);
      }
    }

    fetchMovies();
  }, []);

  return (
    <>
      <Navbar>
        <Search />
        <NumResults length={movies.length} />
      </Navbar>
      <Main>
        <Box>
          {isLoading && <Loader />}
          {!isLoading && !error && <MovieList movies={movies} />}
          {error && <Error error={error} />}
        </Box>
        <Box>
          <WatchedMovieSummery watched={watched} />
          <WatchedMovieList watched={watched} />
        </Box>
        {/* <WatchedBox /> */}
      </Main>
    </>
  );
}

function Loader() {
  return <p className="loader">Loading...</p>;
}

function Error({ error }) {
  return <p className="error">{error}</p>;
}

...remaining code

我找到了一种解决方法,就是简单地使用

throw "message"
而不是创建错误对象。但我需要知道为什么我的应用程序会这样反应。

它是一个简单的应用程序,用于从 omdb 渲染电影。我刚刚开始创建这个。

javascript reactjs error-handling
1个回答
0
投票

问题的答案是:

模块级 Error 函数隐藏或覆盖全局范围内的通用 Error 构造函数。

详细解答:

投掷可能是这里的明星或恶棍。

MDN 文档关于 throw 的摘要可能如下所述。

throw 语句抛出给定的表达式。

众所周知,表达式意味着,它在被求值时会产生一个值。

因此,下面所有的 throw 语句都是有效的。 另请注意每种情况下生成的 console.log。

try {
   throw 1;
} catch (err) {
   console.log(err); // will print 1
}

try {
   throw "one";
} catch (err) {
   console.log(err); // will print "one"
}

try {
   throw (() => 1)(); // immediate invocation
} catch (err) {
   console.log(err); // will print 1
}

火上浇油

上面的讨论可能帮助我们理解 trow 语句如何与不同类型的表达式一起使用。现在,火上浇油无意中隐藏了通用错误构造函数。请通过代码查看下面的插图。

以下代码做了两件事。它使用通用 Error 构造函数创建一个 Error 对象,然后抛出该错误对象。 请注意它在控制台中生成的输出,它基本上是堆栈跟踪。

try {
   throw Error();
} catch (err) {
   console.log(err);
}
});

Error
    at App.js:6:1
    at commitHookEffectListMount (...
    ...
    at commitRoot (react-dom.development.js:26721:1)

但是,以下代码使用自定义错误消息函数创建自定义错误消息。 这里最值得注意的一点可能是命名冲突。块级 Error 函数隐藏了通用 Error 构造函数。对于 JavaScript 中的作用域规则来说确实如此。块级变量将隐藏或覆盖所有其他级别,包括全局范围。

try {
  const Error = () => 'Custom error message';
  throw Error();
} catch (err) {
  console.log(err); // Custom error message
}
© www.soinside.com 2019 - 2024. All rights reserved.