展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > FastAPI 全局异常捕获技巧分享

FastAPI 全局异常捕获技巧分享

答案:FastAPI通过@app.exception_handler注册全局异常处理器,统一捕获HTTPException、RequestValidationError、自定义异常及未处理异常,实现一致的错误响应格式,提升可维护性与安全性。

本文目录

    答案:FastAPI通过@app.exception_handler注册全局异常处理器,统一捕获HTTPException、RequestValidationError、自定义异常及未处理异常,实现一致的错误响应格式,提升可维护性与安全性。

    FastAPI 的全局异常捕获方法

    FastAPI处理全局异常的核心思路,在于通过注册自定义的异常处理器来统一管理和响应各种运行时错误。这不仅能让你的API接口在面对问题时表现得更加健壮和一致,还能极大地提升开发和维护的效率,避免了在每个视图函数中重复编写错误处理逻辑。说实话,没有一个完善的全局异常捕获机制,任何稍微复杂点的项目都会变得难以维护。

    解决方案

    在FastAPI中,你可以使用@app.exception_handler装饰器来注册一个或多个异常处理器。这个装饰器可以捕获特定的异常类型,并允许你返回自定义的HTTP响应。

    1. 捕获FastAPI/Starlette内置的HTTP异常

    FastAPI底层基于Starlette,因此它能很好地处理HTTPException。当你的业务逻辑需要主动抛出带HTTP状态码的错误时,HTTPException是首选。

    from fastapi import FastAPI, HTTPException, Request, status
    from fastapi.responses import JSONResponse
    
    app = FastAPI()
    
    # 示例:一个会抛出HTTPException的路由
    @app.get("/items/{item_id}")
    async def read_item(item_id: int):
        if item_id == 0:
            raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")
        return {"item_id": item_id}
    
    # 注册一个全局的HTTPException处理器
    @app.exception_handler(HTTPException)
    async def http_exception_handler(request: Request, exc: HTTPException):
        # 这里可以做日志记录,或者根据exc.status_code做更细致的判断
        print(f"HTTPException caught: {exc.detail}, status: {exc.status_code}")
        return JSONResponse(
            status_code=exc.status_code,
            content={"message": exc.detail},
        )

    2. 捕获FastAPI的请求验证异常 (RequestValidationError)

    当请求数据不符合Pydantic模型定义时(例如,请求体字段缺失、类型错误),FastAPI会自动抛出RequestValidationError。这是最常见的错误之一。

    from fastapi.exceptions import RequestValidationError
    from pydantic import BaseModel
    
    class Item(BaseModel):
        name: str
        price: float
    
    @app.post("/items/")
    async def create_item(item: Item):
        return item
    
    # 注册一个RequestValidationError处理器
    @app.exception_handler(RequestValidationError)
    async def validation_exception_handler(request: Request, exc: RequestValidationError):
        # exc.errors()会返回详细的验证错误列表
        # print(f"Validation error caught: {exc.errors()}")
        # 我们可以选择性地只返回第一个错误或者格式化所有错误
        error_details = [{"loc": err["loc"], "msg": err["msg"], "type": err["type"]} for err in exc.errors()]
        return JSONResponse(
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
            content={"message": "Validation error", "details": error_details},
        )

    3. 捕获自定义异常

    对于业务逻辑中特有的错误,我们可以定义自己的异常类,并在处理器中捕获它们。

    class MyCustomException(Exception):
        def __init__(self, name: str, message: str = "A custom error occurred"):
            self.name = name
            self.message = message
    
    @app.get("/custom_error")
    async def trigger_custom_error():
        raise MyCustomException(name="CustomErrorType", message="Something went wrong in custom logic!")
    
    # 注册自定义异常处理器
    @app.exception_handler(MyCustomException)
    async def custom_exception_handler(request: Request, exc: MyCustomException):
        print(f"Custom exception caught: {exc.name} - {exc.message}")
        return JSONResponse(
            status_code=status.HTTP_400_BAD_REQUEST, # 或者其他合适的HTTP状态码
            content={"code": exc.name, "message": exc.message},
        )

    4. 捕获所有未被处理的异常(兜底)

    为了确保没有任何异常被遗漏,你可以注册一个针对Exception基类的处理器。这个处理器会捕获所有没有被更具体处理器捕获的异常。

    import traceback
    
    @app.exception_handler(Exception)
    async def universal_exception_handler(request: Request, exc: Exception):
        # 记录详细的错误信息,包括堆栈跟踪,这对于调试至关重要
        print(f"An unexpected error occurred: {type(exc).__name__}: {exc}")
        print(traceback.format_exc()) # 打印完整的堆栈信息
    
        return JSONResponse(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            content={"message": "An unexpected server error occurred. Please try again later."},
        )

    通过以上这些处理器,你的FastAPI应用就能建立起一套全面且统一的异常处理机制。

    为什么全局异常捕获在大型项目中不可或缺?

    在我看来,全局异常捕获在大型项目中的作用,远不止是让代码看起来更整洁那么简单。它更像是一道防线,一道保证系统稳定性和用户体验的防线。试想一下,如果每个API端点都要自己去处理各种可能出现的错误,比如数据库连接失败、外部服务超时、用户输入格式错误等等,那代码里会充斥着大量的try...except块,既冗余又难以维护。

    首先,它确保了API响应的一致性。无论内部发生了什么错误,用户总是能收到一个结构化、可预期的错误响应,而不是一个空白页或者一个晦涩难懂的服务器错误。这种一致性对于前端开发人员来说尤其重要,他们可以基于固定的错误格式来构建用户界面,而不需要为每种错误编写不同的解析逻辑。

    其次,它极大地提升了开发效率和可维护性。当新的错误类型出现或者错误响应格式需要调整时,你只需要修改一处全局处理器,而不是遍历成百上千个API端点。这在大型团队协作中,简直是救命稻草。我个人经历过没有全局异常处理的项目,每次调试一个线上问题,都得花大量时间去定位哪个地方的try...except没写好,简直是噩梦。

    再者,它有助于安全性和信息泄露的防护。不加处理的异常往往会泄露服务器内部的敏感信息,比如文件路径、数据库查询语句、堆栈跟踪等。通过全局异常处理器,我们可以精确控制返回给用户的错误信息,只提供必要的、友好的提示,而将详细的调试信息记录在服务器日志中,确保内部细节不会暴露给外部攻击者。

    最后,它简化了错误日志记录。所有的异常都可以集中在一个地方进行记录,方便我们统一接入日志系统,进行错误分析、告警和监控。这对于快速发现和解决生产环境中的问题至关重要。

    如何区分处理FastAPI的验证错误和业务逻辑异常?

    区分处理FastAPI的验证错误和业务逻辑异常,是构建健壮API的关键一步。它们虽然都是错误,但产生的原因、处理方式以及返回给用户的状态码和信息都应该有所不同。我通常会这样来思考和实践:

    1. 请求验证错误 (RequestValidationError)

    这类错误通常发生在FastAPI接收到请求,但请求数据不符合Pydantic模型定义的时候。比如,你期望一个整数,结果用户传了个字符串;或者某个必填字段根本没传。

    • 特点: 它们是“数据契约”层面的错误,发生在业务逻辑执行之前。通常对应HTTP状态码422 Unprocessable Entity。
    • 处理策略:
      • 统一捕获: 使用@app.exception_handler(RequestValidationError)进行全局捕获。
      • 详细反馈: exc.errors()方法会返回一个包含所有验证错误的列表,每个错误都包含loc(错误位置)、msg(错误消息)和type(错误类型)。我们应该将这些详细信息以结构化的方式返回给客户端,帮助他们准确地定位并修正请求。
      • 避免业务逻辑介入: 在这个阶段,业务逻辑根本还没开始执行,所以处理器不应该包含任何业务判断。

    代码示例(重申并强调):

    from fastapi.exceptions import RequestValidationError
    from fastapi.responses import JSONResponse
    from fastapi import status
    
    # ... (假设app实例和Item模型已定义) ...
    
    @app.exception_handler(RequestValidationError)
    async def validation_exception_handler(request: Request, exc: RequestValidationError):
        # 格式化错误信息,让客户端更容易理解
        formatted_errors = []
        for error in exc.errors():
            # loc通常是元组,如('body', 'name')
            field_name = ".".join(map(str, error["loc"])) if error["loc"] else "unknown"
            formatted_errors.append({
                "field": field_name,
                "message": error["msg"],
                "type": error["type"]
            })
    
        return JSONResponse(
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
            content={
                "code": "VALIDATION_ERROR",
                "message": "Request validation failed.",
                "errors": formatted_errors
            },
        )

    2. 业务逻辑异常 (自定义异常或 HTTPException)

    这类错误发生在业务逻辑执行过程中。例如,用户尝试访问一个不存在的资源,或者执行一个没有权限的操作,又或者某个外部服务调用失败。

    • 特点: 它们是“业务规则”层面的错误,需要根据具体的业务场景来定义和处理。通常对应4xx(客户端错误,如400 Bad Request, 404 Not Found, 403 Forbidden)或5xx(服务器端错误,如500 Internal Server Error, 503 Service Unavailable)状态码。
    • 处理策略:
      • 自定义异常: 对于项目特有的业务错误,我倾向于定义自己的异常类(如UserNotFoundException, PermissionDeniedException)。这让代码更具可读性,也方便在全局处理器中针对性地处理。
      • HTTPException: 对于那些可以直接映射到标准HTTP状态码的业务错误,HTTPException是一个非常方便的选择。
      • 精确的状态码: 根据业务错误的性质返回最准确的HTTP状态码。
      • 业务化消息: 错误消息应该清晰地说明业务问题,而不是底层的技术细节。

    代码示例:

    # 自定义业务异常
    class UserNotFoundException(Exception):
        def __init__(self, user_id: int):
            self.user_id = user_id
            self.message = f"User with ID {user_id} not found."
    
    class InsufficientPermissionsException(HTTPException): # 也可以继承HTTPException
        def __init__(self, required_role: str):
            super().__init__(status_code=status.HTTP_403_FORBIDDEN, detail=f"Requires role: {required_role}")
            self.required_role = required_role
    
    @app.get("/users/{user_id}")
    async def get_user(user_id: int):
        if user_id == 100:
            raise UserNotFoundException(user_id=user_id)
        # 假设用户1是管理员
        if user_id != 1:
            raise InsufficientPermissionsException(required_role="admin")
        return {"user_id": user_id, "name": "Admin User"}
    
    # 捕获自定义异常
    @app.exception_handler(UserNotFoundException)
    async def user_not_found_handler(request: Request, exc: UserNotFoundException):
        return JSONResponse(
            status_code=status.HTTP_404_NOT_FOUND,
            content={"code": "USER_NOT_FOUND", "message": exc.message},
        )
    
    # HTTPException会由之前注册的http_exception_handler处理,但你也可以为特定HTTPException子类创建更具体的处理器。
    # 例如,如果你想为403 Forbidden返回一个更定制化的响应
    @app.exception_handler(InsufficientPermissionsException)
    async def permission_denied_handler(request: Request, exc: InsufficientPermissionsException):
        return JSONResponse(
            status_code=exc.status_code,
            content={"code": "PERMISSION_DENIED", "message": exc.detail, "required_role": exc.required_role},
        )

    总结一下,我的做法是:对于数据格式和API契约问题,交给RequestValidationError处理器,返回详细的字段错误;对于业务逻辑中出现的特定问题,定义自定义异常或使用HTTPException,并为它们注册相应的处理器,返回具有业务意义的错误码和消息。这样,API的错误响应就能做到既精准又友好。

    在异常处理中如何记录日志并返回友好的错误信息?

    在异常处理中,日志记录和返回友好的错误信息是两个同样重要但目的不同的环节。日志记录是为了方便开发者调试和监控,需要尽可能详细;而返回给用户的错误信息是为了提供清晰的指引,需要简洁、安全且易于理解。这两者之间需要一个巧妙的平衡,不能混为一谈。

    1. 详细的日志记录(给开发者看)

    当异常发生时,尤其是在兜底的Exception处理器中,我们需要记录下所有有助于定位问题的细节。这包括:

    • 异常类型和消息: type(exc).__name__ 和 str(exc)。
    • 请求信息: request.url、request.method,甚至可以考虑记录部分请求体(但要注意敏感信息)。
    • 完整的堆栈跟踪: 这是最重要的,traceback.format_exc()能提供完整的调用链,帮助我们快速找到问题根源。
    • 用户或会话ID: 如果有的话,记录这些信息能帮助我们追踪特定用户遇到的问题。

    我通常会配置Python的logging模块来处理日志,并根据日志级别(如ERROR)将它们输出到文件、控制台或者更高级的日志聚合服务(如ELK Stack、Grafana Loki)。

    import logging
    import traceback
    from fastapi.responses import JSONResponse
    from fastapi import status, Request
    
    # 配置日志(这通常在应用启动时完成)
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger = logging.getLogger(__name__)
    
    # ... (假设app实例已定义) ...
    
    @app.exception_handler(Exception)
    async def universal_exception_handler(request: Request, exc: Exception):
        error_id = "ERR-" + str(uuid.uuid4())[:8] # 生成一个唯一的错误ID,方便追踪
    
        # 记录详细的错误日志
        logger.error(
            f"[{error_id}] Unhandled Exception at {request.url} ({request.method}): {type(exc).__name__} - {exc}",
            exc_info=True, # 自动包含堆栈信息
            extra={"request_url": str(request.url), "request_method": request.method}
        )
    
        # 返回给用户友好的错误信息
        return JSONResponse(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            content={
                "code": "INTERNAL_SERVER_ERROR",
                "message": "An unexpected error occurred. Please try again later.",
                "error_id": error_id # 把错误ID返回给用户,方便他们向客服反馈时提供
            },
        )

    2. 友好的错误信息(给用户看)

    返回给用户的错误信息需要遵循几个原则:

    • 简洁明了: 用户不需要知道内部的技术细节,他们只需要知道“发生了什么”以及“我该怎么办”。
    • 避免敏感信息: 绝对不能泄露数据库连接字符串、API密钥、服务器路径等敏感信息。
    • 提供指引: 如果可能,告诉用户下一步可以做什么,比如“请检查您的输入”、“请稍后重试”或者“请联系客服并提供错误ID”。
    • 统一格式: 保持错误响应的结构一致性,例如,始终包含code、message和可选的details或error_id字段。
    • 合适的HTTP状态码: 错误响应的HTTP状态码应该准确反映错误的性质。4xx表示客户端错误,5xx表示服务器端错误。

    示例(基于上述日志记录的universal_exception_handler):

    可以看到,我们返回给用户的content中,只有code、message和一个error_id。这个error_id是个小技巧,当用户反馈问题时,提供这个ID,我们就能根据日志中的ID快速定位到具体的错误日志,大大提高排查效率。

    对于更具体的异常,比如验证错误或自定义业务异常,返回的信息可以更具体,但仍然要保持友好和无害:

    # ... (假设UserNotFoundException处理器已定义) ...
    
    @app.exception_handler(UserNotFoundException)
    async def user_not_found_handler(request: Request, exc: UserNotFoundException):
        logger.warning(f"User not found for ID: {exc.user_id} at {request.url}") # 记录为警告,因为这不是服务器崩溃
        return JSONResponse(
            status_code=status.HTTP_404_NOT_FOUND,
            content={
                "code": "USER_NOT_FOUND",
                "message": exc.message # 这里的message已经是业务友好的
            },
        )

    通过这种分层处理,我们既满足了开发者对详细调试信息的需求,又确保了用户能收到清晰、安全、友好的错误反馈,这对于任何一个严肃的API项目来说都是不可或缺的。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    IntelliJ IDEA macOS版
    IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    PyCharm macOS版
    PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    WebStorm macOS版
    WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    After Effects macOS版
    After Effects macOS版

    Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

    Audition macOS版
    Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Bridge macOS版
    Bridge macOS版

    Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

    Illustrator macOS版
    Illustrator macOS版

    Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

    InDesign macOS版
    InDesign macOS版

    Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

    Lightroom Classic macOS版
    Lightroom Classic macOS版

    Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

    Media Encoder macOS版
    Media Encoder macOS版

    Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

    Photoshop macOS版
    Photoshop macOS版

    Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

    Premiere Pro macOS版
    Premiere Pro macOS版

    Adobe Premiere Pro 是面向专业视频制作的非线性剪辑软件,提供多轨时间线、调色、音频处理、字幕、代理工作流和多格式输出能力,并可与 After Effects、Audition、Photoshop 及 Frame.io 协同

    WINDOWS 更多
    IntelliJ IDEA Windows版
    IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    PhpStorm Windows版
    PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    PyCharm Windows版
    PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    WebStorm Windows版
    WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    Photoshop Windows版
    Photoshop Windows版

    Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许

    InDesign Windows版
    InDesign Windows版

    Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator

    Illustrator Windows版
    Illustrator Windows版

    Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。

    Bridge Windows版
    Bridge Windows版

    Adobe Bridge 是 Adobe 推出的创意资产管理工具,可集中预览、分类和查找照片、视频、PDF及多种设计文件,并支持元数据、关键词、评级、批量重命名和格式导出。它可与 Photoshop、Illustrator 等应用衔接,

    Lightroom Classic Windows版
    Lightroom Classic Windows版

    Adobe Lightroom Classic 是面向 Windows 桌面摄影工作流的照片管理与无损编辑工具,可通过目录集中整理大型图库,并完成 RAW 显影、局部蒙版、批量调整、打印和多格式导出。它强调本地文件管理与精细控制,

    Acrobat Pro Windows版
    Acrobat Pro Windows版

    Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

    After Effects Windows版
    After Effects Windows版

    Adobe After Effects 是面向动态图形、动画与影视视觉特效制作的专业工具,可完成关键帧动画、图层合成、遮罩跟踪、抠像、文字动画和二维三维元素整合。Windows 版通过 Adobe Creative Cloud 安装及更新,

    Media Encoder Windows版
    Media Encoder Windows版

    Adobe Media Encoder 是 Adobe 面向视频与音频制作流程提供的专业编码和转码工具,可批量处理媒体文件、创建代理、套用输出预设并监控文件夹自动执行任务。它与 Premiere、After Effects、Audition