อย่าจับ Exception เร็วเกินไป

เล่าเรื่อง Java บ้าง นาน ๆ ที (หลัง ๆ ไม่ค่อยได้จับครับ ไม่มีโอกาสเท่าไหร่) วันนี้พอดีไปเปิดโค๊ดคนอื่นดู เป็นคลาสที่ออกแบบไว้เป็น utility class แบบว่าย่ออะไรที่ใช้งานบ่อย ๆ ให้เป็นคลาสเดียวกัน ดูผ่าน ๆ ก็ไม่มีปัญหา แต่ว่าผมก็เจออะไรเกี่ยวกับการจัดการ Exception อยู่

ผมว่าหลาย ๆ คนคงเคยเขียนโค๊ดจับ Exception แบบ

public static Socket connect(String host) {
  Socket s = null;
  try {
    s = new Socket(host, 80);
  } catch (Exception e) {
  }
  return s;
}

แล้วไปลุ้นว่า user จะต้องรู้ว่า เฮ้ย ถ้ามันมีปัญหาอะไรสักอย่างแล้ว เมธอดนี้จะคืนค่าเป็น null นะเออ

นอกจากจะแบบนี้แล้ว บางคนอาจจะใจดีขึ้นมาหน่อยนึง ... เขียนแบบนี้

public static Socket connect(String host) {
  Socket s = null;
  try {
    s = new Socket(host, 80);
  } catch (Exception e) {
    e.printStackTrace();
  }
  return s;
}

เพื่อที่จะให้มันพิมพ์ออกคอนโซลว่ามีปัญหานะเอ้อ

ส่วนตัวผมว่าเขียนแบบนี้ดีกว่าครับ

public static Socket connect(String host) 
    throws UnknownHostException, IOException {
  Socket s = new Socket(host, 80);
  return s;
}

พูดง่าย ๆ คือ ให้ user ไปจัดการกับ error เอาเอง แทนที่จะจัดการให้เขา แบบว่า user ก็โตเป็นผู้ใหญ่แล้ว เอ๊ย คือ มันเป็นการให้ทางเลือกกับ user ว่า ถ้าเกิดมีปัญหากับเมธอดนี้แล้ว จะทำยังไงต่อไป โดยบอกเขาด้วยว่ามันเกิดอะไรขึ้น user อาจจะเลือกที่จะ ignore ไป หรือ จะล็อกบน console หรือ แสดงผลออกมา หรืออะไรก็แล้วแต่ การไปจัดการให้เขาตั้งแต่แรกเป็นการลดทางเลือกของเขา ให้เหลือแค่ว่า ทำงานปรกติ กับมีปัญหา (แต่ไม่รู้ว่าเกิดอะไรขึ้น) ซึ่งจะเป็นการบีบให้ user ไม่ใช้โค๊ดเรา แล้วก็ไปเขียนฟังก์ชันใหม่แทน กลายเป็นว่าเกิดโค๊ดที่ซ้ำซ้อนโดยไม่จำเป็นครับ

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *