سؤال

لدي فئة استثناء مخصصة تحتوي على بعض الحقول الإضافية. أريد أن تكون هذه مكتوبة في ToString() الطريقة، ولكن إذا قمت بتنفيذ بلدي ToString(), ، أفقد بعض الأشياء الأخرى المفيدة (مثل كتابة اسم نوع الاستثناء، بيانات الاستثناء الداخلي وتتبع المكدس).

ما هي أفضل طريقة / نمط لتنفيذ الخاصة بك ToString() طريقة لمثل هذه الاستثناءات؟ من الناحية المثالية، يجب إعادة استخدام الآلية الحالية، ولكن يتم تنسيقها في طريقه ToString() التنفيذ.

تحديث: لإعداد أو إلحاق حقول مخصصة أو إلحاق النص المخصص إلى Base.ToString () غير مثالية IMHO، على سبيل المثال

PimTool.Utilities.OERestServiceUnavailableException: test ---> System.InvalidOperationException: inner message
   --- End of inner exception stack trace ---
   at PimTool.Tests.Services.OE.OERestClientTests.ExceptionsLogging() in D:\svn\NewPimTool\PimTool.Tests\Services\OE\OERestClientTests.cs:line 178, 
   StatusCode=0, message='test', requestId='535345'

يعني أن الحقول المخصصة مكتوبة في نهاية وصف استثناء (طويل). من ناحية أخرى، أريد أن يكون نوع الاستثناء أول المعلومات المكتوبة في الوصف.

تحديث 2: لقد قمت بتطبيق حل لهذا، ابحث عن إجابتي أدناه.

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

المحلول 3

حسنا، هذا ما توصلت إليه. لقد قمت بتنفيذ فئة تمديد تتراكم الآلية الأصلية لتنسيق الاستثناءات، ولكن مع تطور: مندوب عمل مخصص يوفر مكون إضافي لتنسيق الحقول المخصصة:

public static class ExceptionFormatterExtensions
{
    public static string ExceptionToString (
        this Exception ex, 
        Action<StringBuilder> customFieldsFormatterAction)
    {
        StringBuilder description = new StringBuilder();
        description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);

        if (customFieldsFormatterAction != null)
            customFieldsFormatterAction(description);

        if (ex.InnerException != null)
        {
            description.AppendFormat(" ---> {0}", ex.InnerException);
            description.AppendFormat(
                "{0}   --- End of inner exception stack trace ---{0}",
                Environment.NewLine);
        }

        description.Append(ex.StackTrace);

        return description.ToString();
    }
}

الآن يمكنك استخدام هذه الطريقة في تطبيقات Tostring () الخاصة بك دون تكرار رمز التنسيق:

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }

نصائح أخرى

هذا كله مبالغة. يجب أن يتجاوز استثناءك خاصية الرسالة.

public override String Message {
    get {  
        return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
    }
}

طريقة Tostring الافتراضية لفئة الاستثناء هي أساسا "ClassName: Message --> InnerException.ToString() StackTrace". لذلك تجاوز الرسالة يضع نص رسالتك بالضبط حيث يجب أن يكون.

يمكنك إضافة البيانات الافتراضية يدويا إلى السلسلة التي تم إرجاعها ToString, من خلال النظر إلى خصائص الاستثناء. على سبيل المثال، سيؤدي ما يلي إلى محاكاة البيانات التي تم إرجاعها افتراضيا بواسطة استثناء ToString الطريقة (على افتراض عدم وجود استثناءات داخلية):

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

أو، يمكنك ببساطة إلحاق (أو إعدام) البيانات التي تم إرجاعها base.ToString إلى المعلومات التي تريد إضافتها.

يمكنك تجاوز طريقة TOSTRING () لتضمين معلوماتك المخصصة الخاصة بك، ولا تزال تتصل بمشاهدة Tostring الأساسي الافتراضي () مثل هذا:

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}

إذا كنت تبحث في المقام الأول في مصحح الأخطاء، فيمكنك استخدام [DebuggerDisplay] السمة لتحديد تنسيقها وعدم لمس الموجودة ToString طريقة.

خلاف ذلك، فقط الزائد ToString وتأكد من استدعاء نسخة الفئة الأساسية base.ToString()

داخل Base Base.tostring () وتعديل السلسلة الناتجة لاحتياجاتك ...

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