การจัดการข้อผิดพลาดและรหัสสถานะ HTTP
ตรวจสอบรหัสสถานะการตอบกลับ และแปลงข้อผิดพลาดเป็นข้อผิดพลาดของโดเมนที่มีชนิด
การจัดการข้อผิดพลาดและรหัสสถานะ HTTP เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
ช่วงรหัสสถานะ HTTP
การตอบกลับ HTTP ส่งสัญญาณความสำเร็จหรือความล้มเหลวผ่านรหัสสถานะ ได้แก่ 2xx สำเร็จ, 3xx เปลี่ยนเส้นทาง, 4xx ข้อผิดพลาดฝั่งไคลเอ็นต์ และ 5xx ข้อผิดพลาดฝั่งเซิร์ฟเวอร์
// 200 OK, 201 Created
// 400 Bad Request, 401 Unauthorized, 404 Not Found
// 500 Internal Server Errorการตรวจสอบสถานะใน Swift
แปลง URLResponse เป็น HTTPURLResponse และตรวจสอบ statusCode หลังจากคำขอแบบอะซิงโครนัส
let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse else {
throw NetworkError.invalidResponse
}
guard (200..<300).contains(http.statusCode) else {
throw NetworkError.httpError(http.statusCode)
}ข้อผิดพลาดเครือข่ายแบบระบุชนิด
กำหนดชนิดแจกแจงข้อผิดพลาดแบบระบุชนิดสำหรับความล้มเหลวของเครือข่าย เพื่อให้บล็อกดักจับครอบคลุมทุกกรณีได้
enum NetworkError: Error {
case invalidURL
case invalidResponse
case httpError(Int)
case decodingError(Error)
case noData
}การแมปรหัสสถานะเป็นข้อผิดพลาด
ตรวจสอบรหัสสถานะเพื่อสร้างข้อผิดพลาดระดับโดเมนที่สื่อความหมาย แทนการใช้จำนวนเต็มดิบ
switch http.statusCode {
case 200..<300: break // success
case 401: throw NetworkError.unauthorized
case 404: throw NetworkError.notFound
case 500..<600: throw NetworkError.serverError(http.statusCode)
default: throw NetworkError.httpError(http.statusCode)
}การถอดรหัสการตอบกลับที่มีข้อผิดพลาด
เมื่อสถานะเป็นข้อผิดพลาด เนื้อหาการตอบกลับมักมีข้อความข้อผิดพลาดในรูปแบบ JSON ให้ถอดรหัสข้อความนั้นเพื่อช่วยวินิจฉัยปัญหาได้ดียิ่งขึ้น
if http.statusCode != 200 {
struct APIError: Decodable { var message: String }
let apiError = try? JSONDecoder().decode(APIError.self, from: data)
throw NetworkError.serverMessage(apiError?.message ?? "Unknown error")
}การส่งต่อข้อผิดพลาดในงานแบบอะซิงโครนัส
การทำงานพร้อมกันแบบมีโครงสร้างของ Swift จะส่งต่อข้อผิดพลาดโดยธรรมชาติ: ข้อผิดพลาดที่ถูกโยนจะยกเลิกงานพี่น้องใน TaskGroup
async let users = fetchUsers()
async let posts = fetchPosts()
let (u, p) = try await (users, posts) // if either throws, both cancelการดักจับข้อผิดพลาดเฉพาะประเภท
ใช้บล็อกดักจับแบบระบุชนิดเพื่อจัดการข้อผิดพลาดแต่ละประเภทอย่างแตกต่างกันในโค้ดที่เรียกใช้งาน
do {
let items = try await fetchItems()
} catch NetworkError.unauthorized {
showLoginScreen()
} catch NetworkError.httpError(let code) {
print("HTTP Error: \(code)")
} catch {
print("Unexpected: \(error)")
}รหัสข้อผิดพลาด URLError
URLError อธิบายความล้มเหลวด้านการเชื่อมต่อ ได้แก่ .notConnectedToInternet, .timedOut และ .cannotFindHost
do {
let (data, _) = try await URLSession.shared.data(from: url)
} catch let urlError as URLError where urlError.code == .notConnectedToInternet {
print("No internet connection")
}ตัวห่อผลลัพธ์สำหรับเครือข่าย
คืนค่า Result จากฟังก์ชัน fetch เมื่อคุณต้องการให้ผู้เรียกจัดการข้อผิดพลาดโดยไม่ใช้ try/catch
func fetchUser() async -> Result<User, NetworkError> {
do {
let user = try await performFetch()
return .success(user)
} catch let e as NetworkError {
return .failure(e)
} catch {
return .failure(.unknown)
}
}การบันทึกข้อผิดพลาด
บันทึกข้อผิดพลาดเครือข่ายพร้อมบริบทที่เกี่ยวข้อง (URL รหัสสถานะ และเนื้อหา) เพื่อช่วยแก้ไขข้อบกพร่องในระบบจริง
func log(_ error: NetworkError, url: URL) {
print("[Network] \(url.absoluteString) → \(error)")
}ข้อความข้อผิดพลาดสำหรับผู้ใช้
แมปข้อผิดพลาดทางเทคนิคเป็นข้อความที่เข้าใจง่ายสำหรับผู้ใช้ อย่าแสดงรหัสสถานะ HTTP ดิบในส่วนติดต่อผู้ใช้
extension NetworkError: LocalizedError {
var errorDescription: String? {
switch self {
case .unauthorized: return "Please log in again."
case .notFound: return "The requested item was not found."
case .serverError: return "Server error. Please try again later."
default: return "Something went wrong."
}
}
}ตรวจสอบอย่างรวดเร็ว
ช่วงรหัสสถานะ HTTP ใดที่แสดงว่าการตอบกลับสำเร็จ
สรุปบทเรียน
หลังจาก URLSession.data(from:) ให้แปลงเป็น HTTPURLResponse และตรวจสอบ statusCode แมปรหัสเป็นกรณีข้อผิดพลาดแบบระบุชนิด ใช้ URLError สำหรับความล้มเหลวด้านการเชื่อมต่อ ส่งต่อข้อผิดพลาดด้วย try/throw และดักจับด้วยบล็อก catch แบบระบุชนิด
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อผิดพลาดและรหัสสถานะ HTTP” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและรหัสสถานะ HTTP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและรหัสสถานะ HTTP”
ตรวจสอบรหัสสถานะการตอบกลับ และแปลงข้อผิดพลาดเป็นข้อผิดพลาดของโดเมนที่มีชนิด คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการข้อผิดพลาดและรหัสสถานะ HTTP” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- URLSession data(from:) พร้อม async/await
- Codable: การเข้ารหัสและถอดรหัส JSON
- การจัดการข้อผิดพลาดและรหัสสถานะ HTTP
- ตรรกะการลองใหม่และ URLSession เบื้องหลัง