superset handleError 源码

  • 2022-10-20
  • 浏览 (232)

superset handleError 代码

文件路径:/superset-frontend/packages/superset-ui-core/src/query/api/v1/handleError.ts

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import {
  SupersetApiError,
  SupersetApiErrorPayload,
  SupersetApiMultiErrorsPayload,
} from './types';

export type ErrorInput = string | Error | Response | SupersetApiErrorPayload;

/**
 * Handle API request errors, convert to consistent Superset API error.
 * @param error the catched error from SupersetClient.request(...)
 */
export default async function handleError(error: ErrorInput): Promise<never> {
  // already a Superset error
  if (error instanceof SupersetApiError) {
    throw error;
  }
  // string is the error message itself
  if (typeof error === 'string') {
    throw new SupersetApiError({ message: error });
  }
  // JS errors, normally happens before request was sent
  if (error instanceof Error) {
    throw new SupersetApiError({
      message: error.message || 'Unknown Error',
      originalError: error,
    });
  }

  let errorJson;
  let originalError;
  let errorMessage = 'Unknown Error';
  let status: number | undefined;
  let statusText: string | undefined;

  // catch HTTP errors
  if (error instanceof Response) {
    const { status: responseStatus, statusText: responseStatusText } = error;
    status = responseStatus;
    statusText = responseStatusText;
    errorMessage = `${status} ${statusText}`;
    try {
      errorJson = (await error.json()) as
        | SupersetApiErrorPayload
        | SupersetApiMultiErrorsPayload;
      originalError = errorJson;
    } catch (error_) {
      originalError = error;
    }
  } else if (error) {
    errorJson = error;
  }

  // when API returns 200 but operation fails (see Python API json_error_response(...))
  // or when frontend promise rejects with `{ error: ... }`
  if (
    errorJson &&
    ('error' in errorJson || 'message' in errorJson || 'errors' in errorJson)
  ) {
    let err;
    if ('errors' in errorJson) {
      err = errorJson.errors?.[0] || {};
    } else if (typeof errorJson.error === 'object') {
      err = errorJson.error;
    } else {
      err = errorJson;
    }
    errorMessage =
      err.message ||
      (err.error as string | undefined) ||
      err.error_type ||
      errorMessage;
    throw new SupersetApiError({
      status,
      statusText,
      message: errorMessage,
      originalError,
      ...err,
    });
  }
  // all unknown error
  throw new SupersetApiError({
    status,
    statusText,
    message: errorMessage,
    originalError: error,
  });
}

相关信息

superset 源码目录

相关文章

superset index 源码

superset makeApi 源码

superset types 源码

0  赞