رسیدگی به خطای زنگ زدگی: یک راهنمای کامل برای ساختن برنامه های قابل اعتماد [2024]
![رسیدگی به خطای زنگ زدگی: یک راهنمای کامل برای ساختن برنامه های قابل اعتماد [2024] رسیدگی به خطای زنگ زدگی: یک راهنمای کامل برای ساختن برنامه های قابل اعتماد [2024]](https://nabfollower.com/blog/wp-content/uploads/2025/03/رسیدگی-به-خطای-زنگ-زدگی-یک-راهنمای-کامل-برای-ساختن.webp-780x470.jpeg)
من به عنوان یک نویسنده پرفروش ، شما را دعوت می کنم تا کتابهای من را در آمازون کشف کنید. فراموش نکنید که مرا در متوسط دنبال کنید و پشتیبانی خود را نشان دهید. ممنون حمایت شما به معنای جهان است!
سیستم کنترل خطای Rust به عنوان یک مکانیسم قدرتمند برای مدیریت خرابی در برنامه ها است. این سیستم ایمنی نوع را با قابلیت های گزارش خطای بیان ترکیب می کند و ساخت نرم افزار قابل اعتماد را آسان تر می کند.
رسیدگی به خطا در مراکز زنگ زدگی در اطراف نوع نتیجه ، که صریحاً نشان دهنده نتایج موفقیت یا خرابی است. این رویکرد مانع از خرابی های خاموش شده و توسعه دهندگان را وادار می کند تا موارد خطا را عمداً برطرف کنند.
ویژگی خطا به عنوان پایه و اساس انواع خطای سفارشی عمل می کند. این عملکرد اصلی مانند پیام های خطا و زنجیرهای خطا را تعریف می کند. بیایید یک سیستم کنترل خطای جامع را پیاده سازی کنیم:
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum DatabaseError {
ConnectionFailed(String),
QueryFailed(String),
PoolExhausted,
}
impl fmt::Display for DatabaseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::ConnectionFailed(msg) => write!(f, "Failed to connect: {}", msg),
Self::QueryFailed(msg) => write!(f, "Query execution failed: {}", msg),
Self::PoolExhausted => write!(f, "Connection pool exhausted"),
}
}
}
impl Error for DatabaseError {}
#[derive(Debug)]
pub enum ServiceError {
Database(DatabaseError),
Validation(String),
Configuration(String),
}
impl fmt::Display for ServiceError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Database(e) => write!(f, "Database error: {}", e),
Self::Validation(msg) => write!(f, "Validation error: {}", msg),
Self::Configuration(msg) => write!(f, "Configuration error: {}", msg),
}
}
}
impl Error for ServiceError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
Self::Database(e) => Some(e),
_ => None,
}
}
}
impl From<DatabaseError> for ServiceError {
fn from(err: DatabaseError) -> Self {
ServiceError::Database(err)
}
}
تبدیل خطا نقش مهمی در حفظ خطای تمیز در لایه های کاربردی دارد. ویژگی از نوع خطای اتوماتیک تبدیل می شود و کد BoilerPlate را کاهش می دهد:
struct User {
id: i32,
name: String,
}
struct UserService {
db_pool: Pool,
}
impl UserService {
pub async fn create_user(&self, name: String) -> Result<User, ServiceError> {
if name.is_empty() {
return Err(ServiceError::Validation("Name cannot be empty".into()));
}
let conn = self.db_pool
.get()
.await
.map_err(|e| DatabaseError::PoolExhausted)?;
let user = conn.execute("INSERT INTO users (name) VALUES ($1)", &[&name])
.await
.map_err(|e| DatabaseError::QueryFailed(e.to_string()))?;
Ok(user)
}
}
جعبه Thiserror ایجاد نوع خطای سفارشی را با ماکروهای مشتق شده ساده می کند:
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ApiError {
#[error("Authentication failed: {0}")]
AuthError(String),
#[error("Resource not found: {0}")]
NotFound(String),
#[error("Invalid input: {0}")]
ValidationError(String),
#[error(transparent)]
DatabaseError(#[from] DatabaseError),
}
fn handle_request() -> Result<(), ApiError> {
let token = validate_token()
.map_err(|e| ApiError::AuthError(e.to_string()))?;
let user = fetch_user(token)
.map_err(|e| ApiError::NotFound("User not found".into()))?;
Ok(())
}
تقویت زمینه خطا قابلیت های اشکال زدایی را بهبود می بخشد. به هر حال جعبه خطای انعطاف پذیر را با انواع خطای پویا فراهم می کند:
use anyhow::{Context, Result};
fn process_config() -> Result<Config> {
let config_path = std::env::var("CONFIG_PATH")
.context("CONFIG_PATH environment variable not set")?;
let config_file = std::fs::read_to_string(&config_path)
.with_context(|| format!("Failed to read config file: {}", config_path))?;
let config: Config = serde_json::from_str(&config_file)
.context("Failed to parse config file")?;
Ok(config)
}
انواع خطای سفارشی از الگوهای پیشرفته مانند بازیابی خطا و مکانیسم های برگشت عقب پشتیبانی می کنند:
#[derive(Debug)]
enum RetryableError {
Temporary(String),
Permanent(String),
}
impl RetryableError {
fn is_retryable(&self) -> bool {
matches!(self, Self::Temporary(_))
}
}
async fn retry_operation<F, T, E>(
mut operation: F,
max_attempts: u32,
) -> Result<T, E>
where
F: FnMut() -> Future<Output = Result<T, RetryableError>>,
E: From<RetryableError>,
{
let mut attempts = 0;
loop {
match operation().await {
Ok(value) => return Ok(value),
Err(e) if e.is_retryable() && attempts < max_attempts => {
attempts += 1;
continue;
}
Err(e) => return Err(e.into()),
}
}
}
ورود به خطا و گزارش گزارش از انواع خطای ساختاری:
use slog::{Logger, info, error, o};
fn log_error(logger: &Logger, err: &ServiceError) {
match err {
ServiceError::Database(db_err) => {
error!(logger, "Database operation failed";
"error" => %db_err,
"error_type" => "database",
);
}
ServiceError::Validation(msg) => {
error!(logger, "Validation failed";
"message" => msg,
"error_type" => "validation",
);
}
ServiceError::Configuration(msg) => {
error!(logger, "Configuration error";
"message" => msg,
"error_type" => "config",
);
}
}
}
آزمایش خطای آزمایش نیاز به بررسی دقیق موارد خطا دارد:
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_conversion() {
let db_error = DatabaseError::ConnectionFailed("timeout".into());
let service_error: ServiceError = db_error.into();
assert!(matches!(service_error, ServiceError::Database(_)));
}
#[test]
fn test_error_display() {
let error = ServiceError::Validation("Invalid input".into());
assert_eq!(
error.to_string(),
"Validation error: Invalid input"
);
}
}
این رویکرد جامع برای رسیدگی به خطا در Rust گزارش خطای واضح ، کد قابل حفظ و مکانیسم های بازیابی خطای قوی را ارائه می دهد. سیستم نوع تضمین می کند که خطاها در حالی که انعطاف پذیری را برای استراتژی های مختلف کنترل خطای ارائه می دهند ، به طور مناسب انجام می شود.
101 کتاب
101 کتاب یک شرکت انتشارات AI محور است که توسط نویسنده تأسیس شده است آراو جوشیبشر با استفاده از فناوری پیشرفته هوش مصنوعی ، ما هزینه های انتشار خود را فوق العاده کم نگه می داریم – برخی از کتاب ها به اندازه کم قیمت هستند 4 دلار– ایجاد دانش با کیفیت در دسترس همه.
کتاب ما را بررسی کنید کد تمیز Golang در آمازون موجود است.
برای به روزرسانی ها و اخبار هیجان انگیز با ما در ارتباط باشید. هنگام خرید کتاب ، جستجو کنید آراو جوشی برای یافتن بیشتر عناوین ما. برای لذت بردن از لینک ارائه شده استفاده کنید تخفیف های خاص!
خلاقیت های ما
حتما خلاقیت های ما را بررسی کنید:
سرمایه گذار مرکزی | سرمایه گذار اسپانیایی مرکزی | سرمایه گذار آلمانی مرکزی | زندگی هوشمند | دوره ها و پژواک | اسرار گیج کننده | هندوتوا | نخبه | مدارس JS
ما در متوسط هستیم
بینش های فنی Koala | Epochs & Echoes World | سرمایه گذار رسانه مرکزی | رمز و رازهای گیج کننده متوسط | علوم و دوره های متوسط | هندوتوا مدرن