ฉันกังวลว่านี่เป็นข้อยกเว้นรันไทม์ดังนั้นจึงควรใช้เท่าที่จำเป็น
กรณีการใช้งานมาตรฐาน:
void setPercentage(int pct) {
if( pct < 0 || pct > 100) {
throw new IllegalArgumentException("bad percent");
}
}
แต่ดูเหมือนว่าจะบังคับให้ออกแบบต่อไปนี้:
public void computeScore() throws MyPackageException {
try {
setPercentage(userInputPercent);
}
catch(IllegalArgumentException exc){
throw new MyPackageException(exc);
}
}
เพื่อให้กลับมาเป็นข้อยกเว้นที่ถูกตรวจสอบ
เอาล่ะ แต่มาดูกันดีกว่า หากคุณป้อนข้อมูลไม่ถูกต้องคุณจะได้รับข้อผิดพลาดรันไทม์ ประการแรกนั่นเป็นนโยบายที่ค่อนข้างยากในการนำไปใช้อย่างสม่ำเสมอเพราะคุณอาจต้องทำการแปลงตรงกันข้าม:
public void scanEmail(String emailStr, InputStream mime) {
try {
EmailAddress parsedAddress = EmailUtil.parse(emailStr);
}
catch(ParseException exc){
throw new IllegalArgumentException("bad email", exc);
}
}
และที่แย่กว่านั้น - ในขณะที่การตรวจสอบ0 <= pct && pct <= 100
รหัสไคลเอ็นต์อาจคาดว่าจะทำแบบคงที่ แต่ไม่ได้เป็นเช่นนั้นสำหรับข้อมูลขั้นสูงเช่นที่อยู่อีเมลหรือแย่กว่านั้นคือมีบางอย่างที่ต้องตรวจสอบกับฐานข้อมูลดังนั้นในรหัสไคลเอนต์ทั่วไปจึงไม่สามารถทำได้ล่วงหน้า ตรวจสอบความถูกต้อง
IllegalArgumentException
ดังนั้นโดยทั่วไปสิ่งที่ฉันพูดคือผมไม่เห็นสอดคล้องกับนโยบายที่มีความหมายสำหรับการใช้งานของ ดูเหมือนว่าไม่ควรใช้และเราควรยึดติดกับข้อยกเว้นที่ตรวจสอบของเราเอง กรณีการใช้งานที่ดีในการโยนสิ่งนี้คืออะไร?