ApiException.fromDioException constructor
ApiException.fromDioException(
- DioException error
Create ApiException from DioException
Implementation
factory ApiException.fromDioException(DioException error) {
String message;
ApiExceptionType type;
int? statusCode;
Map<String, dynamic>? errorData;
switch (error.type) {
case DioExceptionType.connectionTimeout:
case DioExceptionType.sendTimeout:
message = 'Connection timeout. Please check your internet connection.';
type = ApiExceptionType.timeout;
break;
case DioExceptionType.receiveTimeout:
message = 'Server took too long to respond. Please try again.';
type = ApiExceptionType.receiveTimeout;
break;
case DioExceptionType.badResponse:
statusCode = error.response?.statusCode;
errorData = error.response?.data is Map
? Map<String, dynamic>.from(error.response!.data)
: null;
switch (statusCode) {
case 400:
message = _extractErrorMessage(error.response?.data) ??
'Bad request. Please check your input.';
type = ApiExceptionType.badRequest;
break;
case 401:
message = 'Unauthorized. Please login again.';
type = ApiExceptionType.unauthorized;
break;
case 403:
message = 'Forbidden. You don\'t have permission to access this resource.';
type = ApiExceptionType.forbidden;
break;
case 404:
message = 'Resource not found.';
type = ApiExceptionType.notFound;
break;
case 500:
case 502:
case 503:
message = 'Server error. Please try again later.';
type = ApiExceptionType.internalServerError;
break;
default:
message = _extractErrorMessage(error.response?.data) ??
'Something went wrong. Please try again.';
type = ApiExceptionType.unknown;
}
break;
case DioExceptionType.cancel:
message = 'Request was cancelled.';
type = ApiExceptionType.cancel;
break;
case DioExceptionType.connectionError:
if (error.message?.contains('SocketException') ?? false) {
message = 'No internet connection. Please check your network.';
type = ApiExceptionType.noInternet;
} else if (error.message?.contains('CERTIFICATE') ?? false) {
message = 'SSL certificate verification failed.';
type = ApiExceptionType.badCertificate;
} else {
message = 'Connection error. Please check your internet connection.';
type = ApiExceptionType.socketException;
}
break;
case DioExceptionType.badCertificate:
message = 'SSL certificate is invalid.';
type = ApiExceptionType.badCertificate;
break;
case DioExceptionType.unknown:
if (error.error.toString().contains('SocketException')) {
message = 'No internet connection. Please check your network.';
type = ApiExceptionType.noInternet;
} else {
message = error.message ?? 'An unexpected error occurred.';
type = ApiExceptionType.unknown;
}
}
return ApiException(
message: message,
type: type,
statusCode: statusCode,
originalError: error,
stackTrace: error.stackTrace,
errorData: errorData,
);
}