国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Rust 錯誤處理的五種方式及學習特質如何支持繼承

開發 前端
在Rust中,大約有20種處理錯誤的模式,而我們這里只看到了其中的5種。練習多種錯誤模式將有助于更容易地識別這些模式。

在編寫代碼時,學習如何處理錯誤是非常重要的。錯誤通常是由于用戶對程序目的的誤解而產生的。錯誤不僅可以作為用戶的教學工具,還能提高代碼的效率。與我們用于控制流程的邏輯條件不同,錯誤是由于某種期望未被滿足或某個選項不可用而產生的。Rust提供了五種不同的方法來直接解決這些“期望”和“不可用”的問題。

錯誤最終服務于用戶和開發者

當用戶收到晦澀難懂的錯誤反饋時,他們會感到沮喪。而開發者則希望看到導致崩潰的一系列事件或函數調用。這導致我們將錯誤視為字符串和結構化類型。

觀察Python如何處理錯誤

在學習Rust的錯誤處理時,通過比較和對比Python的錯誤處理方式是非常有效的。這樣可以更容易地發現模式。

Python與Rust的比較與對比

無錯誤處理:主函數引發異常并失敗
result = 10 / 0
print(result)

輸出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
Try Except:捕獲邊界情況
try:
    result = 10 / 0  # This will raise ZeroDivisionError
except ZeroDivisionError:
    print("Cannot divide by zero!")
except TypeError:
    print("Type error occurred!")
Try Except Finally:確保異常期間的正確清理
try:
    file = open("example.txt", "r")
except FileNotFoundError:
    print("File not found.")
finally:
    print("Closing file (if open).")
    if 'file' in locals() and not file.closed:
        file.close()
Raising Exception:崩潰代碼/由調用函數處理
age = -1
if age < 0:
    raise ValueError("Age cannot be negative!")
創建自定義錯誤:為開發者提供結構化錯誤
class ApplicationError(Exception):
    """Base class for all application errors."""
    pass

class DatabaseError(ApplicationError):
    """Exception raised for database-related errors."""
    pass

class APIError(ApplicationError):
    """Exception raised for API-related errors."""
    pass

# Usage
try:
    raise DatabaseError("Unable to connect to the database.")
except DatabaseError as e:
    print(f"Database error: {e}")
except ApplicationError:
    print("General application error.")

通過這些處理,程序可以繼續運行,直到用戶關閉應用程序。在此過程中,我們可以看到用戶請求是如何被服務的,以及支持設備和應用程序在做什么。

觀察Rust如何處理錯誤

現在輪到Rust了。錯誤處理中的術語如Panic、Unwrap、Expect,以及“?”,每一個都讓我們采取行動,編寫更好的代碼。在Rust中讓代碼Panic被認為是不好的做法。構建應用程序或庫時,定義良好的錯誤處理是關鍵。

無錯誤處理:Panic!

fn main() {
    let x = 50;
    let y = 0;
    let rs = x / y;
    println!("{}", rs)
}

輸出:

thread 'main' panicked at 'attempt to divide by zero', src/main.rs:11:14

Catch Unwind:捕獲邊界情況

fn main() {
    let x = 50;
    let y = 10;
    let cuw = std::panic::catch_unwind(|| x / y);
    match cuw {
        Ok(val) => println!("Got the {val}"),
        Err(e) => println!("Error: {:?}", e),
    }
}

Rust中的存在檢測:match、Results和Options

Rust是一種強類型和內存安全的語言,這導致了Enum的獨特子數據類型Options和Results。兩者都處理我們感興趣的事物的“存在”和“不存在”。match關鍵字用于檢查返回類型是否為Enum的任何變體。在Option的情況下,它是None或一個可以處理和使用的“已知Rust數據類型”。在Result的情況下,它是Error或我們追求的“值”。

在函數中引發錯誤:傳播錯誤

use std::error::Error;

fn div_by_zero(a: i32, b: i32) -> Result<i32, Box<dyn Error>> {
    if b == 0 {
        return Err("Divide by 0, leads to infinity....".into());
    }
    Ok(a / b)
}

fn main() {
    println!("Doing what catch unwind does, manually");
    let err_rs = div_by_zero(57, 0);
    let val_rs = div_by_zero(50, 5);
    match err_rs {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e),
    }
    match val_rs {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e),
    }
}

創建自定義錯誤:為開發者提供結構化錯誤輸出

use std::error::Error;
#[derive(Debug)]
struct ZeroDivideError {
    details: String,
}

impl ZeroDivideError {
    fn new(msg: &str) -> ZeroDivideError {
        ZeroDivideError {
            details: msg.to_string(),
        }
    }
}

use std::fmt::Display;
impl Error for ZeroDivideError {}
impl Display for ZeroDivideError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Zero divide: {}", self.details)
    }
}

fn div_by_zero_error(a: i32, b: i32) -> Result<i32, ZeroDivideError> {
    if b == 0 {
        return Err(ZeroDivideError::new("Structured output"));
    }
    Ok(a / b)
}

fn main() {
    println!("Creating Custom Errors");
    let err_rs = div_by_zero_error(57, 0);
    let val_rs = div_by_zero_error(50, 5);
    match err_rs {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e),
    }
    match val_rs {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e),
    }
}

輸出:

Creating Custom Errors
Got ZeroDivideError { details: "Structured output" }
Got 10

錯誤類型依賴于實現的Traits

結構體ZeroDivideError是Rust中的一個標準結構體。在Rust中,結構體相當于Python中的類。通過impl Error for ZeroDivideError,我們將ZeroDivideError變成了一個“錯誤類型結構體”。我們還需要為ZeroDivideError實現std::fmt::Display,以便將錯誤顯示給用戶或開發者。

動態處理不同錯誤:使用Box

Box<dyn Error>在函數可能返回不同類型的錯誤時非常有用,可以統一處理這些錯誤。動態分派(dyn)通過允許運行時多態性實現這一點。

use std::error::Error;
#[derive(Debug)]
struct ZeroDivideError {
    details: String,
}

impl ZeroDivideError {
    fn new(msg: &str) -> ZeroDivideError {
        ZeroDivideError {
            details: msg.to_string(),
        }
    }
}

use std::fmt::Display;
impl Error for ZeroDivideError {}
impl Display for ZeroDivideError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Zero divide: {}", self.details)
    }
}

// Combining different error types using `Box<dyn Error>`
pub fn parse_and_double(input: &str) -> Result<i32, Box<dyn Error>> {
    let number = input.parse::<i32>()?;
    Ok(number * 2)
}

pub fn parse_and_dbl(input: &str) -> Result<i32, ZeroDivideError> {
    let number = input.parse::<i32>();
    match number {
        Err(_) => {
            return Err(ZeroDivideError::new(
                "Negative number due to number parsing",
            ))
        }
        Ok(number) => return Ok(number * 2),
    }
}

fn main() {
    println!("Creating Custom Errors");
    let parseme = parse_and_double("56,");
    let prsme = parse_and_dbl("56,");
    match parseme {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e.to_string()),
    }
    match prsme {
        Ok(val) => println!("Got {val}"),
        Err(e) => eprintln!("Got {:?}", e.to_string()),
    }
}

輸出:

Creating Custom Errors
Got "invalid digit found in string"
Got "Zero divide: Negative number due to number parsing"

這并不是Rust中錯誤處理的全部。在Rust中,大約有20種處理錯誤的模式,而我們這里只看到了其中的5種。練習多種錯誤模式將有助于更容易地識別這些模式。

責任編輯:武曉燕 來源: Rust開發筆記
相關推薦

2024-03-05 18:15:28

AsyncAwait前端

2025-02-10 09:49:00

2023-10-08 20:31:18

React

2023-02-22 16:33:04

前端JavaScript

2023-03-10 08:48:29

2015-08-19 14:11:56

SQL Server錯誤處理

2025-03-18 09:20:00

Go語言Golang

2023-10-26 12:05:14

Golang開發

2021-04-14 07:08:14

Nodejs錯誤處理

2024-03-27 08:18:02

Spring映射HTML

2014-01-13 10:36:53

C++錯誤

2014-11-17 10:05:12

Go語言

2021-04-29 09:02:44

語言Go 處理

2022-02-23 12:35:12

LibreOffic無障礙輔助套件

2022-12-30 11:05:40

Rust代碼

2025-01-13 00:00:00

MapStruct繼承關系Java

2023-12-26 22:05:53

并發代碼goroutines

2025-05-16 10:53:43

開發異步編程JavaScrip

2022-11-16 08:41:43

2009-08-05 16:04:50

點贊
收藏

51CTO技術棧公眾號

日本一级淫片演员| 成人漫画网站免费| 激情综合亚洲精品| 黄色片av在线| 欧美成人一级视频| 欧美一区 二区 三区| 欧美日本亚洲视频| 奇米精品一区二区三区在线观看| 熟妇人妻无乱码中文字幕真矢织江 | 牛牛精品视频在线| 精品国产_亚洲人成在线| 亚洲精品一区在线观看香蕉| 日本一区二区三区四区在线视频| 狼人天天伊人久久| 你懂的在线视频| 不卡视频一区| 欧美一二三区在线| 国产精品无码永久免费888| 欧美日韩在线播放视频| 91综合精品国产丝袜长腿久久| 日本久久久精品视频| 亚洲电影免费观看高清| 国内精品免费在线观看| 欧美aaa级| 91porn在线观看| 调教一区二区| 久久99精品久久只有精品| av网站在线不卡| 欧美日本高清视频| 国产精品狼人久久影院观看方式| 国产欧美自拍一区| 国产九一视频| 成人精品aaaa网站| 色老太综合网| 黄色电影免费在线看| 免费成人看片| 国产精品igao激情视频| 亚洲伊人久久综合| 欧美日韩国产二区| 欧美人妇做爰xxxⅹ性高电影| 中文字幕av资源一区| 日本v片在线高清不卡在线观看| 日韩成人一级| 成人一区视频| 日韩色淫视频| 成人性生活视频| 国产美女一区视频| 里番在线播放| 国内高清免费在线视频| √天堂资源地址在线官网| 一二三四社区在线视频6| 在线观看免费国产小视频| 裸体丰满少妇做受久久99精品| 欧美另类变人与禽xxxxx| 蜜臀久久99精品久久久久宅男| 激情欧美丁香| 国产一区二区在线观看视频| 欧美日韩免费高清一区色橹橹| 三上悠亚一区二区| 日韩精品一区二区三区不卡| 奇米四色中文综合久久| 在线亚洲免费视频| 国产一区二区三区美女| 精品按摩偷拍| 国产小视频在线播放| 欧美综合视频| 99久久婷婷| 色999日韩| 一区二区三区四区五区在线| 日本sm残虐另类| 国产自产视频一区二区三区| 久久国产免费看| 国产精品欧美在线| 国内久久久精品| 成人信息集中地欧美| 亚洲综合日韩在线| 精品国产二区在线| 精品少妇人妻av免费久久洗澡| 波多野结衣乳巨码无在线| jizz国产| 免费a级毛片在线播放| 天堂久久一区| 青青草97国产精品麻豆| av在线综合网| 91丝袜美腿高跟国产极品老师| 欧美深夜福利| 视频一区在线| 国产日产精品_国产精品毛片| 欧美三级小说| 亚洲精品乱码久久久久| 男人日女人的bb| 精品久久五月天| 国产精品久久久久影视| 亚洲精品日韩久久| 国产精品2区| 成人福利在线| 黄在线观看网站| av激情久久| 福利一区视频在线观看| 91精品蜜臀在线一区尤物| xxx欧美精品| 国产日韩在线观看av| 日本黑人久久| 国产毛片av在线| 亚洲ww精品| 久久久久.com| 一区二区三区.www| 久久精品一本久久99精品| 97se亚洲综合| 91视频-88av| 欧美一级视频一区二区| 国产啪精品视频| 久草在线在线视频| 久久综合网导航| 秋霞欧美视频| 成人免费一区二区三区在线观看| 日韩欧美中文一区二区| 国产嫩草影院久久久久| 欧美国产另类| 一区二区三区国产精品| 日韩在线免费视频观看| 国产真实老熟女无套内射| 二区视频在线| 在线a人片免费观看视频| 视频在线观看入口黄最新永久免费国产| 国内精品久久久久国产| 亚洲丁香日韩| 欧美日韩中文字幕在线视频| 免费无码av片在线观看| 欧美日韩精品一区二区| 18成人在线视频| 99久久精品久久久久久清纯| 日韩影院免费视频| 午夜亚洲福利| 成人羞羞在线观看网站| 美女av一区| 国产精品一区二区美女视频免费看| 91探花在线观看| 日本www在线| 欧美大片aaa| 亚欧黄色av| 自拍偷拍精选| 777米奇影视第四色| 国产av熟女一区二区三区| 亚洲啪啪av| 国精产品99永久一区一区| 外国精品视频在线观看| 免费看日本黄色| 亚洲图片都市激情| 免费一区二区三区| 国产精品久久久久av福利动漫| 国产欧美韩国高清| 日韩av不卡在线| 久久久亚洲国产| 久久在精品线影院精品国产| 亚洲区免费影片| 亚洲美女中文字幕| 精品99999| 精品免费国产二区三区| 欧美一区二区精美| 日韩一区二区三区视频在线观看| 欧美日韩国产高清一区二区三区| 欧美性猛交xxxx黑人交| 欧美性色欧美a在线播放| 在线精品视频小说1| 欧美午夜免费电影| 欧美久久久久久久久中文字幕| 欧美日韩在线电影| 7777精品伊人久久久大香线蕉| 欧美美女视频在线观看| 日韩天堂在线观看| 亚洲国产精品va在线看黑人 | 欧美12av| 蜜桃传媒视频麻豆第一区免费观看| 国产精品精品软件视频| 精品免费视频123区| 日本日本精品二区免费| 亚洲乱码一区二区三区 | 欧美无砖砖区免费| 欧美三级中文字| 欧美一级理论性理论a| av综合电影网站| 成人精品小视频| 免费黄色一级网站| 在线观看免费污视频| 日本免费一二区| 国产永久av在线| 欧美人与性动交α欧美精品图片| 不卡的av影片| 在线成人视屏| 91蝌蚪精品视频| 第一sis亚洲原创| 亚洲黄色av| 奇米影视一区二区三区| 国产成人av影院| 国产精品免费aⅴ片在线观看| 亚洲最大成人网4388xx| 欧美日韩中文字幕一区二区| 精品亚洲国产成av人片传媒| 久久99久久久久久久噜噜|