更新於 2024/06/03閱讀時間約 4 分鐘

1.19 TryCatch

使用 TryCatch 處理註冊入學

一個用於管理學生註冊的智能合約。該合約有一個名為 registerStudent() 的函數,用於處理學生的註冊請求。該函數需要檢查學生的資格並將其添加到學生名單中。但是,可能會出現各種錯誤,例如學生信息不完整、學費未支付或註冊名額已滿。

try 區塊包含檢查學生信息、學費支付情況和註冊名額的代碼,以及將學生添加到學生名單中的代碼。如果任何檢查失敗,控制將會轉移到 catch Error(string memory reason) 區塊。reason 變量將會被分配可讀錯誤消息,合約將會回滾,將錯誤消息返回給調用者。

如果發生沒有可讀錯誤消息的錯誤,控制將會轉移到 catch (bytes memory reason) 區塊。reason 變量將會被分配原始錯誤數據,合約將會回滾,將原始錯誤數據返回給調用者。

contract StudentRegistration {

struct Student {
uint256 studentId;
string name;
string email;
uint256 tuitionPaid;
}

mapping(uint256 => Student) public students;
uint256 public registrationCount;

function registerStudent(uint256 studentId, string memory name, string memory email, uint256 tuitionPaid) public {
// 嘗試註冊學生
try {
// 檢查學生信息是否完整
require(studentId > 0 && bytes(name).length > 0 && bytes(email).length > 0, "Invalid student information");

// 檢查學費是否支付
require(tuitionPaid >= 1000, "Insufficient tuition payment");

// 檢查註冊名額是否已滿
require(registrationCount < 100, "Registration limit reached");

// 將學生添加到學生名單中
students[studentId] = Student(studentId, name, email, tuitionPaid);

// 更新註冊計數
registrationCount++;

// 發出註冊成功事件
emit StudentRegistered(studentId, name, email);
} catch Error(string memory reason) {
// 處理註冊失敗的錯誤
revert(reason);
} catch (bytes memory reason) {
// 處理所有其他類型的錯誤
revert(reason);
}
}

event StudentRegistered(uint256 studentId, string name, string email);
}
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.