中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么處理程序錯(cuò)誤

本篇內(nèi)容主要講解“怎么處理程序錯(cuò)誤”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么處理程序錯(cuò)誤”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到鄂托克前網(wǎng)站設(shè)計(jì)與鄂托克前網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鄂托克前地區(qū)。

1

程序錯(cuò)誤類型

1.1

語法錯(cuò)誤

語法錯(cuò)誤是因?yàn)樵闯绦蛑胁徽_的代碼產(chǎn)生的,即在編寫程序時(shí)沒有遵守語法(或詞法)規(guī)則,書寫了錯(cuò)誤的語法代碼,從而導(dǎo)致編譯器無法正確解釋源代碼而產(chǎn)生的錯(cuò)誤,通常是由于錄入的錯(cuò)誤引起的,它在詞法分析或語法分析時(shí)檢測出來。如“非法字符”、“括號不匹配”、“缺少;”之類的錯(cuò)誤。

1.2

語義錯(cuò)誤

語義錯(cuò)誤是指源程序中不符合語義規(guī)則的錯(cuò)誤,即一條語句試圖執(zhí)行一條不可能執(zhí)行的操作而產(chǎn)生的錯(cuò)誤。語義錯(cuò)誤有的在語義分析時(shí)檢測處來,有的在運(yùn)行時(shí)才能檢測出來。如變量聲明錯(cuò)誤、作用域錯(cuò)誤、數(shù)據(jù)存儲區(qū)的溢出等錯(cuò)誤。

1.3

邏輯錯(cuò)誤

邏輯錯(cuò)誤是指程序的運(yùn)行結(jié)果和程序員的設(shè)想有出入時(shí)產(chǎn)生的錯(cuò)誤。這類錯(cuò)誤并不直接導(dǎo)致程序在編譯期間和運(yùn)行期間出現(xiàn)錯(cuò)誤,但是程序未按預(yù)期方式執(zhí)行,產(chǎn)生了不正確的運(yùn)行結(jié)果,較難發(fā)現(xiàn)。這種錯(cuò)誤只能通過分析結(jié)果,將結(jié)果與設(shè)計(jì)方案進(jìn)行對比來發(fā)現(xiàn)。

2

HTTPException

我們用 HTTPException 模塊返回帶錯(cuò)誤信息的 Response。HTTPException 是一個(gè)普通的 Python 異常,同時(shí)帶有與 API 訪問有關(guān)的附加數(shù)據(jù)。

from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"book": "Learn Python"}

@app.get("/items/{item_id}")async def read_item(item_id: str):    if item_id not in items:
       raise HTTPException(status_code=404, detail="Item not found")
   return {"item": items[item_id]}

3

添加自定義頭信息

有時(shí)候針對 HTTP 錯(cuò)誤,在一些場景下,我們需要添加自定義頭信息

from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"book": "Learn Python"}

@app.get("/items-header/{item_id}")async def read_item_header(item_id: str):    if item_id not in items:        raise HTTPException(            status_code=404,            detail="Item not found",            headers={"X-Error": "error info"},
       )    return {"item": items[item_id]}

4

自定義異常處理器

在 fastapi 中借助 the same exception utilities from Starlette,我們可以添加自定義異常處理器。假設(shè)我們有個(gè)自定義異常 UnicornException,我們想在全局范圍內(nèi)處理這個(gè)異常。借助 @app.exception_handler(),就可以實(shí)現(xiàn)我們的目標(biāo)。


from fastapi import FastAPI, Requestfrom fastapi.responses import JSONResponse
class UnicornException(Exception):    def __init__(self, name: str):        self.name = name
app = FastAPI()
@app.exception_handler(UnicornException)async def unicorn_exception_handler(request: Request, exc: UnicornException):
   return JSONResponse(        status_code=418,        content={"message": f"Oops! {exc.name} did something. error"},    )
@app.get("/get_name_info/{name}")async def read_unicorn(name: str):    if name == "haishiniu":        raise UnicornException(name=name)
   return {"name": name}

5

重寫缺省異常處理器

fastapi 有一些缺省的異常處理器。當(dāng)我們拋出 HTTPException 異?;蛘弋?dāng)請求有非法數(shù)據(jù)的時(shí)候,這些處理器負(fù)責(zé)返回默認(rèn)的 JSON 結(jié)果。我們可以重寫這些異常處理器。

5.1

重寫請求校驗(yàn)異常處理器

當(dāng)一個(gè)請求包含非法數(shù)據(jù)的時(shí)候,fastapi 內(nèi)部會拋出 RequestValidationError 異常,并且有默認(rèn)的異常處理器來處理。我們可以用 @app.exception_handler(RequestValidationError) 來重寫這個(gè)異常處理器。


from fastapi import FastAPI, HTTPExceptionfrom fastapi.exceptions import RequestValidationErrorfrom fastapi.responses import PlainTextResponsefrom starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)async def http_exception_handler(request, exc):    return PlainTextResponse(str(exc.detail), status_code=exc.status_code)

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):    return PlainTextResponse(str(exc), status_code=400)

@app.get("/items/{item_id}")async def read_item(item_id: int):    if item_id == 3:        raise HTTPException(status_code=418, detail="Nope! I don't like 3.")    return {"item_id": item_id}

5.2

重寫 HTTPException 異常處理器

同樣的方法,我們可以重寫 HTTPException 異常處理器。例如,你可能想返回純文本格式而不是 JSON 格式的錯(cuò)誤信息。

from fastapi import FastAPI, HTTPExceptionfrom fastapi.exceptions import RequestValidationErrorfrom fastapi.responses import PlainTextResponsefrom starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
   return PlainTextResponse(str(exc.detail), status_code=exc.status_code)
@app.exception_handler(RequestValidationError)async def validation_exception_handler(request, exc):    return PlainTextResponse(str(exc), status_code=400)

@app.get("/items/{item_id}")async def read_item(item_id: int):    if item_id == 3:
       raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
   return {"item_id": item_id}

5.3

重用缺省異常處理器

我們可以導(dǎo)入并且重用缺省的異常處理器。我們從 fastapi.exception_handlers 導(dǎo)入缺省異常處理器。

from fastapi import FastAPI, HTTPExceptionfrom fastapi.exception_handlers import (    http_exception_handler,    request_validation_exception_handler,)
from fastapi.exceptions import RequestValidationErrorfrom starlette.exceptions import HTTPException as StarletteHTTPException
app = FastAPI()
@app.exception_handler(StarletteHTTPException)async def custom_http_exception_handler(request, exc):    print(f"OMG! An HTTP error!: {repr(exc)}")    return await http_exception_handler(request, exc)

@app.exception_handler(RequestValidationError)async def validation_exception_handler(request, exc):    print(f"OMG! The client sent invalid data!: {exc}")    return await request_validation_exception_handler(request, exc)


@app.get("/items/{item_id}")async def read_item(item_id: int):    if item_id == 3:        raise HTTPException(status_code=418, detail="Nope! I don't like 3.")    return {"item_id": item_id}

在示例中,我們在拋出異常之前添加了一條日志輸出。我們可以根據(jù)業(yè)務(wù)需求靈活的重用缺省異常處理器。

6

fastapi HTTPException 對比 Starlette HTTPException

fastapi 中 HTTPException 繼承自 Starlette 的 HTTPException。
唯一的區(qū)別 fastapi 中 HTTPException 允許你在 response 添加頭信息。主要在內(nèi)部用于 OAuth 2.0 以及一些安全相關(guān)的功能。
因此,通常我們在代碼中拋出 fastapi 的 HTTPException 異常。但是,當(dāng)我們注冊異常處理器的時(shí)候,我們應(yīng)該注冊為 Starlette 的 HTTPException。這樣,當(dāng) Starlette 的內(nèi)部代碼或者 Starlette 擴(kuò)展插件拋出 Starlette HTTPException 時(shí),我們的處理器才能正常捕獲和處理這個(gè)異常。如果我們要在代碼中同時(shí)使用這兩個(gè)類,為了避免命名沖突,我們可以重命名其中一個(gè)類。

到此,相信大家對“怎么處理程序錯(cuò)誤”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享題目:怎么處理程序錯(cuò)誤
路徑分享:http://www.rwnh.cn/article30/pgeopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈面包屑導(dǎo)航、微信公眾號、網(wǎng)站改版、企業(yè)建站、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
平阳县| 库尔勒市| 平原县| 吴旗县| 琼海市| 思南县| 根河市| 衢州市| 厦门市| 娱乐| 芦溪县| 壤塘县| 湖口县| 新宾| 射阳县| 盐津县| 张家港市| 桑植县| 芷江| 信阳市| 乌拉特后旗| 息烽县| 桐城市| 资讯| 延安市| 广饶县| 礼泉县| 蒙城县| 定州市| 怀化市| 永济市| 黄骅市| 阿尔山市| 来凤县| 新巴尔虎右旗| 松溪县| 瑞昌市| 漳州市| 呼图壁县| 夏邑县| 琼结县|