যদি আমরা একটি ব্যতিক্রম বার্তা লগইন করি এবং কোনও আলাদা ব্যতিক্রম ছুঁড়ে ফেলি তবে এটি কি এখনও অ্যান্টিপ্যাটার্ন?


18

আমাদের ওয়েব অ্যাপ্লিকেশনটি 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(), এটি ইতিমধ্যে ভুল।
বিজিকলপ



আইএমও এটি একটি ওয়েব সার্ভিস যে বিষয়টি উল্লেখ না করা মোটেই ন্যায়সঙ্গত নয়। এটি সত্যিই গেমের নিয়মগুলিকে পরিবর্তন করে, কারণ উদাহরণস্বরূপ কেবল নিয়মিত ব্যতিক্রম হ্যান্ডলিং মেকানিক্স ব্যবহার করা কোনও সুরক্ষা ঝুঁকি হতে পারে; আপনি চাইছেন না যে কোনও এবং সমস্ত ব্যতিক্রম কেবল 500 ত্রুটি প্রতিক্রিয়াতে ফিরে পাঠানো উচিত, এটি পরীক্ষা করে ফিল্টার করা দরকার। বাহ্যিক ক্লায়েন্টরা সরাসরি ডেকে আনছে এমন সিস্টেমগুলির সাথে লেনদেন করার সময় আক্রমণাত্মক অন-দ্য স্পট লগিং আরও বেশি সাধারণ। পরিষেবা কলগুলিতে স্ট্যাকট্রেসগুলি লগইন করা যা বারবার আহ্বান করা হয় তা নিয়ন্ত্রণহীন লগ ফাইলের আকার এবং কার্য সম্পাদনের সমস্যা হতে পারে।

@ গিম্বি এই ক্ষেত্রে ওপি প্রতিক্রিয়াতে কোনও ত্রুটির বিবরণ প্রেরণ করে না (সম্ভবত একটি বয়লারপ্লেট "ত্রুটি ঘটেছে" সামগ্রী)। এছাড়াও, আপনি কীভাবে কোনও স্ট্যাকট্রেস ছাড়াই কোনও সমস্যা নির্ণয় করবেন? ঘূর্ণায়মান ল্যাগাররা নিয়মিত স্টোরেজ আকারের যত্ন নেয় এবং লগ ডেটা এম্ব্রেসিয়েবলভাবে সংকোচনযোগ্য।
মার্কো টপলনিক

উত্তর:


36

আপনার কোডটি আসলে একটি নয়, তিনটি অ্যান্টিপ্যাটার্নগুলি স্পোর্ট করে:

  1. লগ এবং পুনর্বিবেচনা;
  2. আসল কারণ মোড়ানো ছাড়া পুনর্বিবেচনা;
  3. কেবল বার্তাটি লগ করুন এবং স্ট্যাকট্রেস নয় (এটি সবচেয়ে খারাপ একটি)।

আপনি যদি সেরা অনুশীলনটি অনুসরণ করেন তবে:

  1. মোটেও ধরেনা (ব্যতিক্রমটি তার নিজের মতো করে প্রচার করা যাক);
  2. যদি চেক করা ব্যতিক্রম ধরতে বাধ্য করা হয় তবে চেক না করা এবং পুনর্বিবেচনাতে গুটিয়ে রাখুন;
  3. শীর্ষ স্তরের ব্যতীত আর কখনও লগ ইন করবেন না;
  4. সম্পূর্ণ ব্যতিক্রম স্ট্যাকট্রেস সঙ্গে লগ log.error("Error occurred", e);

তারপরে আপনার বর্তমান একটি সহ আপনি কোনও দ্বিধাদ্বন্দ্বের মুখোমুখি হবেন না, কারণ লগড স্ট্যাকট্রেসে সমস্ত মোড়ানো ব্যতিক্রমগুলিও অন্তর্ভুক্ত থাকবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.