面试题答案
一键面试// 自定义错误类型
#[derive(Debug)]
enum DatabaseError {
ConnectionError(String),
SqlExecutionError(String),
}
// 实现 std::error::Error trait
impl std::error::Error for DatabaseError {}
// 实现 std::fmt::Display trait
impl std::fmt::Display for DatabaseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DatabaseError::ConnectionError(err) => write!(f, "数据库连接错误: {}", err),
DatabaseError::SqlExecutionError(err) => write!(f, "SQL语句执行错误: {}", err),
}
}
}
// 模拟数据库连接函数
fn connect_to_database() -> Result<(), DatabaseError> {
// 这里简单模拟连接失败的情况
Err(DatabaseError::ConnectionError("连接失败".to_string()))
}
// 模拟执行SQL语句函数
fn execute_sql() -> Result<(), DatabaseError> {
// 这里简单模拟执行失败的情况
Err(DatabaseError::SqlExecutionError("执行失败".to_string()))
}
// 复杂的数据库操作函数链
fn complex_database_operation() -> Result<(), DatabaseError> {
connect_to_database()?;
execute_sql()?;
Ok(())
}
// 自定义另一个错误类型
#[derive(Debug)]
struct OtherError(String);
// 实现 std::error::Error trait
impl std::error::Error for OtherError {}
// 实现 std::fmt::Display trait
impl std::fmt::Display for OtherError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "其他错误: {}", self.0)
}
}
// 实现 From<OtherError> for DatabaseError
impl From<OtherError> for DatabaseError {
fn from(err: OtherError) -> Self {
DatabaseError::SqlExecutionError(err.0)
}
}
fn main() {
match complex_database_operation() {
Ok(_) => println!("数据库操作成功"),
Err(err) => println!("数据库操作失败: {}", err),
}
let other_err = OtherError("一些其他问题".to_string());
let db_err: DatabaseError = other_err.into();
println!("转换后的错误: {}", db_err);
}
在上述代码中:
- 自定义错误类型:定义了
DatabaseError
枚举类型,包含ConnectionError
和SqlExecutionError
变体,用于表示数据库连接错误和 SQL 语句执行错误。 - 错误传播:在
complex_database_operation
函数中,通过?
操作符传播connect_to_database
和execute_sql
函数可能产生的错误。如果任何一个函数返回错误,complex_database_operation
也会返回错误。 - 错误处理:在
main
函数中,通过match
语句处理complex_database_operation
函数返回的结果,打印成功或失败信息。 From
trait 进行错误类型转换:定义了OtherError
类型,并实现了From<OtherError> for DatabaseError
,这样可以将OtherError
类型的错误转换为DatabaseError
类型。在main
函数中展示了如何使用into
方法进行转换。