Hanye官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useErrorHandler.ts 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { ref } from 'vue';
  2. /**
  3. * 通用错误处理钩子
  4. * 用于处理API请求和其他异步操作中的错误
  5. * @returns 包含错误状态和处理方法的对象
  6. */
  7. export function useErrorHandler() {
  8. const error = ref<Error | null>(null);
  9. const isLoading = ref(false);
  10. /**
  11. * 重置错误状态
  12. */
  13. function resetError() {
  14. error.value = null;
  15. }
  16. /**
  17. * 处理错误并更新状态
  18. * @param err - 捕获到的错误
  19. */
  20. function handleError(err: unknown) {
  21. if (err instanceof Error) {
  22. error.value = err;
  23. } else if (typeof err === 'string') {
  24. error.value = new Error(err);
  25. } else {
  26. error.value = new Error('发生未知错误');
  27. }
  28. isLoading.value = false;
  29. console.error('错误:', error.value);
  30. }
  31. /**
  32. * 包装异步函数以自动处理错误
  33. * @param asyncFn - 需要执行的异步函数
  34. * @returns 包装后的异步函数
  35. */
  36. async function wrapAsync<T>(asyncFn: () => Promise<T>): Promise<T | null> {
  37. try {
  38. isLoading.value = true;
  39. resetError();
  40. const result = await asyncFn();
  41. return result;
  42. } catch (err) {
  43. handleError(err);
  44. return null;
  45. } finally {
  46. isLoading.value = false;
  47. }
  48. }
  49. return {
  50. error,
  51. isLoading,
  52. resetError,
  53. handleError,
  54. wrapAsync
  55. };
  56. }