ยังคงเป็น antipattern หรือไม่ถ้าเราบันทึกข้อความแสดงข้อผิดพลาดและส่งข้อยกเว้นอื่น?


18

WebApplication ของเราคือการใช้เพื่อแมข้อยกเว้นบางประการExceptionMapper Responseเราบันทึกข้อความข้อยกเว้นก่อนที่จะส่งข้อยกเว้นใหม่ดังนี้:

catch (SomeException ex) {
  LOG.error(ex.getMessage());
  throw new MyException(ex.getMessage());
}

เราจะไม่ได้อีกครั้งการขว้างปายกเว้นเดียวกันดังนั้นคำถามของฉันคือถ้าเรื่องนี้จะได้รับการพิจารณาเข้าสู่ระบบและโยน antipattern และจะเป็นการดีกว่าถ้าจะลบการบันทึกในสถานที่ที่คล้ายกันและย้ายไปยังExceptionMapperคลาสต่างๆดังนี้:

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {

  // bla bla 

  @Override
  public Response toResponse(final MyException ex) {
    LOG.error(ex.getMessage());
    return Response.status(400).entity("something").build();
  }
}

3
ฉันจะหยุดคุณทันทีที่คุณเข้าสู่ระบบex.getMessage()นั่นผิดแล้ว
biziclop

1
เป็นไปได้ที่ซ้ำกันของคุณควรรายงานข้อความของข้อยกเว้น?


IMO มันไม่ยุติธรรมเลยที่จะไม่พูดถึงเลยว่านี่เป็นเว็บเซอร์ สิ่งนี้ทำให้กฎของเกมเปลี่ยนไปจริงๆตัวอย่างเช่นการใช้กลไกการจัดการข้อยกเว้นเป็นประจำอาจเสี่ยงต่อความปลอดภัย คุณไม่ต้องการให้ข้อยกเว้นใด ๆ และทั้งหมดถูกส่งกลับไปในการตอบสนองข้อผิดพลาด 500 ซึ่งจะต้องมีการตรวจสอบและกรอง การบันทึกแบบทันทีทันใดนั้นเป็นเรื่องธรรมดามากเมื่อจัดการกับระบบที่มีไคลเอ็นต์ภายนอกเรียกใช้งานโดยตรง การบันทึก stacktraces ในการเรียกใช้บริการที่ถูกเรียกซ้ำ ๆ อาจทำให้ขนาดไฟล์บันทึกไม่สามารถจัดการได้และปัญหาประสิทธิภาพการทำงาน

@Gimby ในกรณีนี้ OP ไม่ได้ส่งรายละเอียดข้อผิดพลาดใด ๆ ในการตอบสนอง (อาจเป็นเนื้อหา นอกจากนี้คุณจะวินิจฉัยปัญหาได้อย่างไร ตัวบันทึกการทำงานแบบหมุนเวียนจะดูแลขนาดหน่วยเก็บข้อมูลและข้อมูลบันทึกอย่างสม่ำเสมอสามารถบีบอัดได้อย่างน่าอาย
Marko Topolnik

คำตอบ:


36

รหัสของคุณไม่ใช่กีฬาอย่างเดียว แต่มีสาม antipatterns:

  1. เข้าสู่ระบบและทำใหม่;
  2. rethrow โดยไม่ต้องห่อสาเหตุเดิม;
  3. บันทึกเฉพาะข้อความและไม่ใช่สแต็กเทรซ (นี่คือสิ่งที่แย่ที่สุด)

หากคุณปฏิบัติตามแนวปฏิบัติที่ดีที่สุดเพื่อ:

  1. ไม่จับเลย (ให้ข้อยกเว้นเผยแพร่ด้วยตัวเอง);
  2. หากถูกบังคับให้จับข้อยกเว้นที่ตรวจสอบให้ห่อเป็นไม่ จำกัด และทำใหม่;
  3. ไม่เคยล็อกอะไรเลยยกเว้นที่ระดับสูงสุด;
  4. บันทึกการติดตามสแต็กยกเว้นทั้งหมด log.error("Error occurred", e);

จากนั้นคุณจะไม่ต้องเผชิญกับวิกฤติใด ๆ รวมถึงปัญหาปัจจุบันของคุณเนื่องจากสแต็คที่บันทึกไว้จะรวมข้อยกเว้นที่ห่อไว้ทั้งหมดด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.