0Pricing
Swift Academy · บทเรียน

การจัดการข้อผิดพลาดและรหัสสถานะ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. URLSession data(from:) พร้อม async/await
  2. Codable: การเข้ารหัสและถอดรหัส JSON
  3. การจัดการข้อผิดพลาดและรหัสสถานะ HTTP
  4. ตรรกะการลองใหม่และ URLSession เบื้องหลัง
← กลับไปที่ Swift Academy