开发者社区 问答 正文

文档智能这是咋了?

文档智能这是咋了?
Traceback (most recent call last):
File "/Users/icourt/PycharmProjects/pythonProject/aliPDF2png.py", line 34, in submit_file
print(response.body.data.id)
AttributeError: 'NoneType' object has no attribute 'id'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Users/icourt/PycharmProjects/pythonProject/aliPDF2png.py", line 42, in
submit_file(pdf_file,file_name)
File "/Users/icourt/PycharmProjects/pythonProject/aliPDF2png.py", line 37, in submit_file
UtilClient.assert_as_string(error.message)
AttributeError: 'AttributeError' object has no attribute 'message'

展开
收起
嘟嘟嘟嘟嘟嘟 2024-03-19 17:27:10 61 分享 版权
阿里云 AI 助理回答

根据您提供的错误信息和知识库中的相关资料,以下是问题的详细分析与解决方案:


问题分析

  1. 错误描述

    • 第一个错误:AttributeError: 'NoneType' object has no attribute 'id'
      这表明在尝试访问 response.body.data.id 时,response.body.data 的值为 None。这通常是因为文档处理任务未成功返回预期的结果。
    • 第二个错误:AttributeError: 'AttributeError' object has no attribute 'message'
      这是由于在捕获第一个异常后,代码尝试访问 error.message,但 error 对象本身是一个 AttributeError 类型,不包含 message 属性。
  2. 可能原因

    • 文档提交失败或任务未正确初始化,导致 response.body.data 为空。
    • SDK 调用过程中未正确处理任务状态,例如任务仍在处理中或已失败。
    • 提交的文档格式或内容不符合要求,导致服务端无法解析。
  3. 关键点

    • 需要检查任务提交接口的返回值,确保任务成功创建。
    • 需要轮询任务状态,确认任务是否完成。
    • 确保上传的文档格式符合支持的类型(如 PDF、图片等)。

解决方案

步骤 1:检查任务提交接口的返回值

在调用 SubmitDocStructureJobSubmitDocStructureJobAdvance 接口时,需验证返回的 response 是否包含有效的任务 ID。如果任务提交失败,response.body 可能为空或不包含 data.id

修改代码如下:

try:
    response = client.submit_doc_structure_job_advance(request)
    if not response.body or not hasattr(response.body, 'data') or not response.body.data.id:
        raise ValueError("任务提交失败,未获取到有效的任务ID")
    task_id = response.body.data.id
    print(f"任务ID: {task_id}")
except Exception as e:
    print(f"任务提交失败: {str(e)}")

步骤 2:轮询任务状态

根据知识库中的说明,任务处理结果需要通过轮询查询接口 GetDocStructureResult 获取。建议每 10 秒轮询一次,最多轮询 120 分钟。

示例代码如下:

import time

def check_task_status(task_id):
    try:
        for _ in range(720):  # 最多轮询 120 分钟
            request = docmind_api20220711_models.GetDocStructureResultRequest(id=task_id)
            response = client.get_doc_structure_result(request)
            
            if response.body.completed:
                if response.body.status == "success":
                    print("任务处理成功")
                    return response.body
                elif response.body.status == "failed":
                    raise ValueError(f"任务处理失败: {response.body.error_message}")
            
            time.sleep(10)  # 每 10 秒轮询一次
        
        raise TimeoutError("任务处理超时")
    except Exception as e:
        print(f"任务状态查询失败: {str(e)}")

# 调用轮询函数
task_id = "docmind-20220902-824b****"  # 替换为实际任务ID
result = check_task_status(task_id)
print(result)

步骤 3:验证文档格式与内容

确保上传的文档符合支持的格式(如 PDF、图片等),并检查文档内容是否完整。如果文档格式不支持或内容损坏,可能导致任务提交失败。

支持的文档格式包括: - 图片:.png, .jpg, .jpeg, .bmp, .gif - 文档:.pdf, .doc, .docx, .ppt, .pptx, .xls, .xlsx, .txt, .epub, .mobi, .md, .html

步骤 4:改进异常处理

在捕获异常时,避免直接访问不存在的属性(如 error.message)。可以改用通用的异常处理方式,打印完整的错误信息。

示例代码如下:

try:
    # 调用接口逻辑
    pass
except AttributeError as e:
    print(f"属性访问错误: {str(e)}")
except Exception as e:
    print(f"发生未知错误: {str(e)}")

总结与建议

  1. 任务提交阶段
    确保任务提交成功,并获取有效的任务 ID。如果任务提交失败,需检查文档格式和内容是否符合要求。

  2. 任务状态查询阶段
    使用轮询机制查询任务状态,确保任务处理完成后再访问结果数据。

  3. 异常处理优化
    改进异常处理逻辑,避免因访问不存在的属性导致二次异常。

  4. 参考文档智能支持的格式
    确保上传的文档格式在支持范围内,并检查文档内容是否完整。

通过以上步骤,您可以有效解决当前问题并提升代码的健壮性。如果问题仍未解决,请提供更多上下文信息以便进一步分析。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: