كيف أقوم بإرفاق المعلومات إلى STDERR عندما تقوم إحدى الطرق بإنشاء stderr؟

StackOverflow https://stackoverflow.com/questions/1034536

سؤال

هل هناك طريقة ما يمكنني من خلالها ملاحظة عندما تقوم إحدى الطرق بإنشاء كتابة إلى STDERR؟أحاول تعليق بعض المعلومات مسبقًا مع كل كتابة STDERR.

لنفترض أن طريقتنا هي:

parser.thatGeneratesSTDERR();

سوف تولد شيئا من هذا القبيل

السطر 37:29 لا يوجد بديل قابل للتطبيق عند الحرف "أ"

هل يمكنني فقط لفه بشيء يمسك بـ Stderr ليتم كتابته وتجهيز بعض المعلومات مسبقًا بحيث يبدو هكذا بدلاً من ذلك:

ملف:mybadfile.txt - السطر 37:29 لا يوجد بديل قابل للتطبيق عند الحرف "a"

أعلم أنه ربما يمكنني البحث في الكود الفعلي الذي يقوم بكتابة STDERR ولكني لا أريد فعل ذلك حقًا - أفضل فقط لف بعض التعليمات البرمجية حول هذه الطريقة بدلاً من ذلك.

يجب أن أشير إلى أن هذه الطريقة لا تولد دائمًا STDERR - السبب الذي يجعلني أحاول اكتشافها هو أنه لا ينبغي أن تولد أي STDERR - ولكن بما أن هذا يتم استدعاؤه على عدد قليل من الملفات (أكثر من 40) فأنا لا تعرف أبدًا الملف الذي يُنشئ رسالة الخطأ - حيث يستغرق العثور عليه وقتًا طويلاً.

تحديثحسنًا، يمكننا تغيير STDERR -- لقد نسيت للتو أنني بحاجة إلى تجاوز println الخاص بي في STDERR الجديد...إليك الكود ذو الصلة:

public static String errfile = "";

static {
  final PrintStream currentErr = System.err;
  PrintStream newErr = new PrintStream(currentErr)
  { 
    public void println(String string) {
      print("File: " + errfile + " --");
      print(string);
      super.println();
    }
  };

  System.setErr(newErr);
}

بعد ذلك، بالنسبة لكل ملف أقوم باختباره، كل ما علي فعله هو تغيير ملف الخطأ إلى اسم الملف وسيظهر الإخراج الخاص بي بشكل متوقع ...

شكرًا جزيلاً!

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كان هذا سينجح، نظرًا لكيفية عمل System.setErr.

سأقوم بإنشاء فصل دراسي جديد يعمل على توسيع تدفق الطباعة والكتابة فوق طرق إضافة تعليقك مسبقًا.ثم قم بتعيين دفق الخطأ إلى دفق الطباعة الجديد الخاص بك.لا تقم باستدعاء System.err.printxxx من هذه الفئة الجديدة.

السابق...

class PrependPrintStream extends PrintStream {

PrependPrintStream(PrintStream ps, String pre){...}
...
public void print(boolean b) {
super.print(this.pre);
super.print(b);
}
...

لقد بحثت في PrintStream impl الخاص بشركة Sun، ويبدو أن جميع مندوبي printxxx يكتبون (سلسلة) وهي خاصة وليست محمية.أعتقد أنه يمكنك نسخ/لصق الكود.

يحرر::

أ كثيراً الحل الأفضل هو استخدام التسجيل بدلاً من System.err.يتيح لك ذلك إيقاف تشغيل كشوفاتك وتشغيلها، كما يسمح لك بإنشاء معالج أخطاء مخصص.يمكن لمعالجك المحدد أن يضيف العبارة التي تريدها إلى السلسلة قبل الطباعة إلى System.err.يتمتع هذا أيضًا بميزة أن البيانات التي تستخدم المُسجل المحدد الخاص بك هي فقط التي تحتوي على النص المُعلق مسبقًا، بينما لن تحتوي الاستدعاءات الأخرى إلى System.err على ذلك.

نصائح أخرى

يبدو أنك ربما تريد إلقاء نظرة على البرمجة الموجهة نحو الجانب (AOP).باستخدام AOP، يمكنك إنشاء وكيل للمحلل الذي تتصل به.قبل استدعاء الأسلوب thatGeneratesSTDERR()، يمكنك جعله يستدعيك.من مكالمتك يمكنك إخراج المعلومات التي تريدها.

لاحظ أن الأمر قد يستغرق بعض القراءة لفهم كيفية عمل AOP.

الجانب J - http://www.Eclipse.org/aspectj/

تحالف AOP - http://sourceforge.net/projects/aopalliance

يمكنك استخدام System.setErr لإعادة توجيه stderr إلى PrintStream الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top