MST

星途 面试题库

面试题:Python框架中if语句与异常捕获的深度应用

在一个基于Django的Web应用框架中,用户输入数据后会进行一系列业务逻辑处理,其中部分处理依赖外部API调用。请详细阐述如何合理运用if语句与异常捕获,确保在面对用户输入异常、API调用失败等多种复杂情况下,应用程序能够保持健壮性和稳定性。同时,说明如何进行异常的分类处理,以提供给用户合适的反馈信息,并编写核心代码片段展示关键处理逻辑。
12.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 健壮性设计思路

  • 用户输入异常处理:在接收用户输入后,首先对输入数据进行合法性验证。例如,对于数字类型的输入,检查是否为有效数字;对于必填字段,检查是否为空。如果输入不合法,捕获异常并给出相应提示。
  • API调用失败处理:在调用外部API时,由于网络问题、API服务端故障等原因可能导致调用失败。需要捕获可能出现的异常(如网络异常、API返回错误状态码等),并进行适当处理。

2. 异常分类处理

  • 输入验证异常:这类异常是由于用户输入不符合要求导致的。通常返回给用户友好的提示信息,告知输入的错误之处,如“请输入有效的数字”或“该字段不能为空”。
  • API调用异常:细分网络异常(如连接超时、DNS解析失败等)和API服务端异常(如返回404、500等错误状态码)。对于网络异常,可以提示用户检查网络连接;对于API服务端异常,可以告知用户服务暂时不可用,请稍后重试。

3. 核心代码片段

假设我们有一个视图函数,接收用户输入并调用外部API:

import requests
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def process_user_input(request):
    if request.method == 'POST':
        try:
            # 获取用户输入数据
            user_input = request.POST.get('input_field')
            if not user_input:
                raise ValueError('输入字段不能为空')
            
            # 假设这里需要将输入转换为整数
            input_number = int(user_input)

            # 调用外部API
            api_url = 'https://example.com/api'
            response = requests.get(api_url, params={'number': input_number})
            response.raise_for_status()  # 检查API返回状态码,如果是4xx或5xx,抛出异常

            api_data = response.json()
            # 继续后续业务逻辑处理
            result = api_data.get('result')
            return JsonResponse({'status': 'success', 'result': result})

        except ValueError as ve:
            # 处理用户输入异常
            return JsonResponse({'status': 'error', 'message': str(ve)}, status = 400)
        except requests.RequestException as re:
            # 处理API调用网络异常
            return JsonResponse({'status': 'error', 'message': '网络连接问题,请检查网络'}, status = 503)
        except Exception as e:
            # 捕获其他未知异常
            return JsonResponse({'status': 'error', 'message': '系统出现异常,请稍后重试'}, status = 500)
    else:
        return JsonResponse({'status': 'error', 'message': '仅支持POST请求'}, status = 405)

上述代码首先检查用户输入是否为空并尝试将其转换为整数,如果失败则捕获ValueError异常。在调用外部API时,使用requests库并通过raise_for_status()方法检查API返回状态码,如果状态码表示错误则抛出异常。不同类型的异常被分类捕获并返回给用户合适的反馈信息。