จะทำให้ ELMAH ทำงานร่วมกับแอตทริบิวต์ ASP.NET MVC [HandleError] ได้อย่างไร


564

ฉันกำลังพยายามใช้ ELMAH เพื่อบันทึกข้อผิดพลาดในแอปพลิเคชัน ASP.NET MVC ของฉันอย่างไรก็ตามเมื่อฉันใช้แอตทริบิวต์ [HandleError] บนตัวควบคุมของฉัน ELMAH จะไม่บันทึกข้อผิดพลาดเมื่อเกิดขึ้น

ในขณะที่ฉันเดาเพราะ ELMAH บันทึกข้อผิดพลาดที่ไม่สามารถจัดการได้เท่านั้นและแอตทริบิวต์ [HandleError] กำลังจัดการข้อผิดพลาดดังนั้นจึงไม่จำเป็นต้องบันทึก

ฉันจะแก้ไขหรือฉันจะแก้ไขแอททริบิวต์อย่างไรเพื่อให้ ELMAH รู้ว่ามีข้อผิดพลาดและเข้าสู่ระบบ ..

แก้ไข:ให้ฉันแน่ใจว่าทุกคนเข้าใจฉันรู้ว่าฉันสามารถปรับเปลี่ยนแอตทริบิวต์ที่ไม่ใช่คำถามที่ฉันขอ ... ELMAH ถูกบายพาสเมื่อใช้แอตทริบิวต์ handleerror ซึ่งหมายความว่าจะไม่เห็นว่ามีข้อผิดพลาดเนื่องจากมีการจัดการ มีแอตทริบิวต์อยู่แล้ว ... สิ่งที่ฉันถามมีวิธีทำให้ ELMAH เห็นข้อผิดพลาดและบันทึกแม้ว่าแอตทริบิวต์จะจัดการกับมัน ... ฉันค้นหาไปรอบ ๆ และไม่เห็นวิธีใด ๆ ที่จะเรียกให้บังคับให้เข้าสู่ระบบ ข้อผิดพลาด....


12
ว้าวฉันหวังว่า Jeff หรือ Jared จะตอบคำถามนี้ พวกเขากำลังใช้ ELMAH สำหรับ Stackoverflow;)
Jon Limjap

11
อืมแปลก - เราไม่ใช้ HandleErrorAttribute - Elmah ตั้งค่าไว้ในส่วน <modules> ของ web.config มีประโยชน์ในการใช้ HandleErrorAttribute หรือไม่
Jarrod Dixon

9
@Jarrod - ยินดีที่ได้เห็นว่ามีอะไร "กำหนดเอง" เกี่ยวกับ ELMAH fork ของคุณ
สกอตต์ Hanselman

3
@dswatik นอกจากนี้คุณยังสามารถป้องกันการเปลี่ยนเส้นทางโดยตั้งค่า redirectMode เป็น ResponseRewrite ใน web.config ดูblog.turlov.com/2009/01/…
Pavel Chuchuva

6
ฉันยังคงทำงานในเอกสารทางเว็บและโพสต์ที่พูดถึงคุณลักษณะ [HandleError] และ Elmah แต่ฉันไม่เห็นพฤติกรรมที่แก้ปัญหานี้ (เช่น Elmah ไม่ได้บันทึกข้อผิดพลาด "จัดการ") เมื่อฉันตั้งค่ากรณีจำลอง นี่คือเนื่องจากเป็นของ Elmah.MVC 2.0.x HandleErrorAttribute แบบกำหนดเองนี้ไม่จำเป็น มันรวมอยู่ในแพ็คเกจ nuget
plyawn

คำตอบ:


503

คุณสามารถคลาสย่อยHandleErrorAttributeและแทนที่OnExceptionสมาชิก (ไม่จำเป็นต้องคัดลอก) เพื่อที่จะบันทึกข้อยกเว้นด้วย ELMAH และเฉพาะในกรณีที่การใช้งานฐานจัดการมัน จำนวนรหัสน้อยที่สุดที่คุณต้องการมีดังนี้:

using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled) 
            return;
        var httpContext = context.HttpContext.ApplicationInstance.Context;
        var signal = ErrorSignal.FromContext(httpContext);
        signal.Raise(context.Exception, httpContext);
    }
}

การใช้งานฐานถูกเรียกใช้ก่อนทำให้มีโอกาสทำเครื่องหมายข้อยกเว้นว่าถูกจัดการ มีเพียงข้อยกเว้นที่ส่งสัญญาณ รหัสข้างต้นนั้นง่ายและอาจทำให้เกิดปัญหาหากใช้ในสภาพแวดล้อมที่HttpContextอาจไม่พร้อมใช้งานเช่นการทดสอบ ด้วยเหตุนี้คุณจะต้องการโค้ดที่มีการป้องกันมากขึ้น (โดยมีค่าใช้จ่ายนานกว่าเล็กน้อย):

using System.Web;
using System.Web.Mvc;
using Elmah;

public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        if (!context.ExceptionHandled       // if unhandled, will be logged anyhow
            || TryRaiseErrorSignal(context) // prefer signaling, if possible
            || IsFiltered(context))         // filtered?
            return;

        LogException(context);
    }

    private static bool TryRaiseErrorSignal(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        if (httpContext == null)
            return false;
        var signal = ErrorSignal.FromContext(httpContext);
        if (signal == null)
            return false;
        signal.Raise(context.Exception, httpContext);
        return true;
    }

    private static bool IsFiltered(ExceptionContext context)
    {
        var config = context.HttpContext.GetSection("elmah/errorFilter")
                        as ErrorFilterConfiguration;

        if (config == null)
            return false;

        var testContext = new ErrorFilterModule.AssertionHelperContext(
                              context.Exception, 
                              GetHttpContextImpl(context.HttpContext));
        return config.Assertion.Test(testContext);
    }

    private static void LogException(ExceptionContext context)
    {
        var httpContext = GetHttpContextImpl(context.HttpContext);
        var error = new Error(context.Exception, httpContext);
        ErrorLog.GetDefault(httpContext).Log(error);
    }

    private static HttpContext GetHttpContextImpl(HttpContextBase context)
    {
        return context.ApplicationInstance.Context;
    }
}

รุ่นที่สองนี้จะพยายามใช้การส่งสัญญาณข้อผิดพลาดจาก ELMAH ก่อนซึ่งเกี่ยวข้องกับไปป์ไลน์ที่กำหนดค่าอย่างสมบูรณ์เช่นการบันทึกการส่งจดหมายการกรองและสิ่งที่มีอยู่ในตัวคุณ ความล้มเหลวนั้นจะพยายามดูว่าข้อผิดพลาดควรถูกกรองหรือไม่ ถ้าไม่ใช่ข้อผิดพลาดจะถูกบันทึกเพียงแค่ การใช้งานนี้ไม่ได้จัดการกับการแจ้งเตือนจดหมาย หากข้อยกเว้นสามารถส่งสัญญาณได้เมลจะถูกส่งหากกำหนดให้ทำเช่นนั้น

คุณอาจต้องระมัดระวังว่าหากมีหลายHandleErrorAttributeอินสแตนซ์แล้วการบันทึกที่ซ้ำกันจะไม่เกิดขึ้น แต่ตัวอย่างสองตัวอย่างข้างต้นควรเริ่มต้นของคุณ


1
ยอดเยี่ยม ฉันไม่ได้พยายามใช้ Elmah เลย ฉันแค่พยายามขอรายงานข้อผิดพลาดของตัวเองฉันใช้มาหลายปีในแบบที่ทำงานได้ดีกับ MVC รหัสของคุณเป็นจุดเริ่มต้นให้ฉัน +1
Steve Wortham

18
คุณไม่จำเป็นต้องใช้คลาสย่อย HandleErrorAttribute คุณสามารถมีการใช้งาน IExceptionFilter และลงทะเบียนพร้อมกับ HandleErrorAttribute นอกจากนี้ฉันไม่เข้าใจว่าทำไมคุณต้องมีทางเลือกในกรณีที่ ErrorSignal.Raise (.. ) ล้มเหลว หากไปป์ไลน์ถูกกำหนดค่าไม่ดีควรแก้ไข สำหรับ 5 liner IExceptionFilter จุดตรวจที่ 4 ที่นี่ - ivanz.com/2011/05/08/…
Ivan Zlatev

5
กรุณาคุณสามารถแสดงความคิดเห็นเกี่ยวกับคำตอบด้านล่างโดย @IvanZlatev เกี่ยวกับการบังคับใช้ข้อบกพร่อง ฯลฯ ผู้คนกำลังแสดงความคิดเห็นว่ามันง่ายขึ้น / สั้นลง / ง่ายขึ้นและได้รับเช่นเดียวกับคำตอบของคุณและควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง มันจะเป็นการดีถ้าคุณมีมุมมองนี้และบรรลุความชัดเจนด้วยคำตอบเหล่านี้
Andrew

7
สิ่งนี้ยังเกี่ยวข้องหรือไม่หรือ ELMAH.MVC จัดการสิ่งนี้หรือไม่
Romias

2
แม้ฉันอยากจะรู้ว่ามันยังมีความเกี่ยวข้องในรุ่นปัจจุบันหรือไม่
refactor

299

ขออภัยฉันคิดว่าคำตอบที่ยอมรับนั้นเกินความจริง สิ่งที่คุณต้องทำคือ:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

และลงทะเบียน (คำสั่งซื้อเป็นสิ่งสำคัญ) ใน Global.asax.cs:

public static void RegisterGlobalFilters (GlobalFilterCollection filters)
{
    filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
}

3
1 ดีมากไม่จำเป็นต้องขยายHandleErrorAttributeไม่จำเป็นต้องแทนที่บนOnException BaseControllerนี่คือคำตอบที่ได้รับการยอมรับ
CallMeLaNN

1
@bigb ฉันคิดว่าคุณจะต้องตัดข้อยกเว้นในประเภทยกเว้นของคุณเองเพื่อผนวกสิ่งที่จะยกเว้นข้อความ ฯลฯ (เช่นnew UnhandledLoggedException(Exception thrown)ที่ผนวกบางสิ่งบางอย่างไปMessageก่อนที่จะกลับมา.
ไอวานซลาเตฟ

23
Atif Aziz สร้าง ELMAH ฉันจะไปกับคำตอบของเขา
jamiebarrow

48
@jamiebarrow ฉันไม่ทราบ แต่คำตอบของเขาคือ ~ 2 ปีและอาจเป็นไปได้ว่า API ได้รับการปรับปรุงให้ง่ายขึ้นเพื่อรองรับกรณีการใช้งานของคำถามในลักษณะที่สั้นกว่า
Ivan Zlatev

6
@Ivan Zlatev จริงๆไม่สามารถทำงานได้ElmahHandledErrorLoggerFilter()elmah เพียงแค่บันทึกข้อผิดพลาดที่ไม่ได้จัดการ แต่ไม่ได้จัดการ ฉันลงทะเบียนตัวกรองตามลำดับที่ถูกต้องตามที่คุณพูดถึงความคิดใด ๆ
kuncevic.dev

14

ขณะนี้มีแพ็คเกจ ELMAH.MVC ใน NuGet ที่รวมโซลูชันที่ปรับปรุงโดย Atif และคอนโทรลเลอร์ที่จัดการอินเตอร์เฟส elmah ภายในการกำหนดเส้นทาง MVC (ไม่จำเป็นต้องใช้ axd นั้นอีกต่อไป)
ปัญหาเกี่ยวกับโซลูชันนั้น (และกับโซลูชั่นทั้งหมดที่นี่ ) ก็คือวิธีหนึ่งหรืออีกวิธีหนึ่งที่ตัวจัดการข้อผิดพลาด elmah กำลังจัดการข้อผิดพลาดโดยไม่สนใจสิ่งที่คุณอาจต้องการตั้งค่าเป็นแท็ก customError หรือผ่าน ErrorHandler หรือตัวจัดการข้อผิดพลาดของคุณเอง
ทางออกที่ดีที่สุด IMHO คือการสร้างตัวกรองที่จะทำงานในตอนท้ายของตัวกรองอื่น ๆ ทั้งหมดและบันทึกเหตุการณ์ที่ได้รับการจัดการแล้ว โมดูล elmah ควรดูแลการบันทึกข้อผิดพลาดอื่น ๆ ที่ไม่ได้จัดการโดยแอปพลิเคชัน สิ่งนี้จะช่วยให้คุณใช้โปรแกรมตรวจสอบสุขภาพและโมดูลอื่น ๆ ทั้งหมดที่สามารถเพิ่มลงใน asp.net เพื่อดูเหตุการณ์ข้อผิดพลาด

ฉันเขียนสิ่งนี้โดยใช้ตัวสะท้อนที่ ErrorHandler ภายใน elmah.mvc

public class ElmahMVCErrorFilter : IExceptionFilter
{
   private static ErrorFilterConfiguration _config;

   public void OnException(ExceptionContext context)
   {
       if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
       {
           var e = context.Exception;
           var context2 = context.HttpContext.ApplicationInstance.Context;
           //TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
           if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
           {
            _LogException(e, context2);
           }
       }
   }

   private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
   {
       if (_config == null)
       {
           _config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
       }
       var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
       return _config.Assertion.Test(context2);
   }

   private static void _LogException(System.Exception e, System.Web.HttpContext context)
   {
       ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
   }


   private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
   {
       var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
       if (signal == null)
       {
           return false;
       }
       signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
       return true;
   }
}

ตอนนี้ในการกำหนดค่าตัวกรองของคุณคุณต้องการทำสิ่งนี้:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //These filters should go at the end of the pipeline, add all error handlers before
        filters.Add(new ElmahMVCErrorFilter());
    }

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

ตอนนี้ตรวจสอบให้แน่ใจว่า appsettings สำหรับ elmah ใน webconfig ของคุณมีลักษณะดังนี้:

<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->

สิ่งสำคัญที่นี่คือ "elmah.mvc.disableHandleErrorFilter" ถ้านี่เป็นเท็จมันจะใช้ตัวจัดการภายใน elmah.mvc ที่จริงจะจัดการข้อยกเว้นโดยใช้ HandleErrorHandler เริ่มต้นที่จะไม่สนใจการตั้งค่า customError ของคุณ

การตั้งค่านี้ช่วยให้คุณสามารถตั้งค่าแท็ก ErrorHandler ของคุณเองในคลาสและมุมมองในขณะที่ยังบันทึกข้อผิดพลาดผ่าน ElmahMVCErrorFilter เพิ่มการกำหนดค่า customError ไปยัง web.config ผ่านโมดูล elmah แม้กระทั่งการเขียน Error Handler ของคุณเอง สิ่งเดียวที่คุณต้องทำคืออย่าลืมเพิ่มตัวกรองใด ๆ ที่จะจัดการกับข้อผิดพลาดก่อนที่ตัวกรอง elmah ที่เราเขียน และฉันลืมที่จะพูดถึง: ไม่มีการซ้ำซ้อนใน elmah


7

คุณสามารถนำโค้ดด้านบนและดำเนินการต่อไปอีกขั้นหนึ่งโดยแนะนำโรงงานควบคุมแบบกำหนดเองที่แทรกคุณลักษณะ HandleErrorWithElmah ลงในตัวควบคุมทุกตัว

สำหรับข้อมูลเพิ่มเติมตรวจสอบชุดบล็อกของฉันในการเข้าสู่ระบบ MVC บทความแรกครอบคลุมถึงการติดตั้ง Elmah และใช้งานกับ MVC

มีลิงค์ไปยังรหัสที่สามารถดาวน์โหลดได้ในตอนท้ายของบทความ หวังว่าจะช่วย

http://dotnetdarren.wordpress.com/


6
ดูเหมือนว่าฉันจะง่ายกว่าที่จะติดกับคลาสคอนโทรลเลอร์พื้นฐาน!
Nathan Taylor

2
ซีรี่ส์ของ Darren ด้านบนเกี่ยวกับการบันทึกและการจัดการข้อยกเว้นนั้นคุ้มค่ากับการอ่าน !!! ถี่ถ้วนมาก!
Ryan Anderson

6

ฉันใหม่ใน ASP.NET MVC ฉันประสบปัญหาเดียวกันต่อไปนี้เป็นของฉันสามารถทำงานได้ใน Erorr.vbhtml ของฉัน (มันทำงานถ้าคุณเพียงแค่ต้องบันทึกข้อผิดพลาดโดยใช้บันทึก Elmah)

@ModelType System.Web.Mvc.HandleErrorInfo

    @Code
        ViewData("Title") = "Error"
        Dim item As HandleErrorInfo = CType(Model, HandleErrorInfo)
        //To log error with Elmah
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(New Elmah.Error(Model.Exception, HttpContext.Current))
    End Code

<h2>
    Sorry, an error occurred while processing your request.<br />

    @item.ActionName<br />
    @item.ControllerName<br />
    @item.Exception.Message
</h2> 

มันเป็นเพียง!


นี่คือทางออกที่ง่ายที่สุด ไม่จำเป็นต้องเขียนหรือลงทะเบียนตัวจัดการและสิ่งที่กำหนดเอง ทำงานได้ดีสำหรับฉัน
ThiagoAlves

3
จะถูกละเว้นสำหรับการตอบกลับ JSON / ไม่ใช่ HTML
Craig Stuntz

6
สิ่งนี้กำลังทำหน้าที่ระดับบริการในมุมมอง ไม่ได้อยู่ที่นี่
Trevor de Koekkoek

6

ทางเลือกที่สมบูรณ์แบบคือไม่ใช้ MVC HandleErrorAttributeและพึ่งพาการจัดการข้อผิดพลาด ASP.Net แทนซึ่ง Elmah ถูกออกแบบมาเพื่อทำงานกับ

คุณต้องลบค่าเริ่มต้นส่วนกลางHandleErrorAttributeจาก App_Start \ FilterConfig (หรือ Global.asax) จากนั้นตั้งค่าหน้าข้อผิดพลาดใน Web.config ของคุณ:

<customErrors mode="RemoteOnly" defaultRedirect="~/error/" />

หมายเหตุนี่อาจเป็น URL ที่กำหนดเส้นทางของ MVC ดังนั้นข้อมูลข้างต้นจะเปลี่ยนเส้นทางไปยังการErrorController.Indexดำเนินการเมื่อเกิดข้อผิดพลาด


นี่คือวิธีที่ง่ายที่สุดโดยให้ห่างไกลและการเปลี่ยนเส้นทางเริ่มต้นที่สามารถดำเนินการ MVC :)
เจเรมีคุก

3
นั่นจะเปลี่ยนเส้นทางสำหรับคำขอประเภทอื่นเช่น JSON เป็นต้น - ไม่ดี
zvolkov

5

สำหรับฉันมันสำคัญมากที่จะต้องใช้การบันทึกอีเมล หลังจากเวลาผ่านไปฉันพบว่าต้องใช้โค้ดเพียง 2 บรรทัดในตัวอย่าง Atif

public class HandleErrorWithElmahAttribute : HandleErrorAttribute
{
    static ElmahMVCMailModule error_mail_log = new ElmahMVCMailModule();

    public override void OnException(ExceptionContext context)
    {
        error_mail_log.Init(HttpContext.Current.ApplicationInstance);
        [...]
    }
    [...]
}

ฉันหวังว่านี่จะช่วยให้ใครบางคน :)


2

นี่คือสิ่งที่ฉันต้องการสำหรับการกำหนดค่าไซต์ MVC ของฉัน!

ฉันได้เพิ่มการดัดแปลงเล็กน้อยเพื่อOnExceptionวิธีการจัดการหลายHandleErrorAttributeอินสแตนซ์ตามที่ Atif Aziz แนะนำ:

โปรดจำไว้ว่าคุณอาจต้องระมัดระวังว่าหากมีหลายHandleErrorAttributeอินสแตนซ์เกิดขึ้นการบันทึกที่ซ้ำกันจะไม่เกิดขึ้น

ฉันเพียงตรวจสอบcontext.ExceptionHandledก่อนที่จะเรียกคลาสฐานเพียงเพื่อทราบว่ามีคนจัดการข้อยกเว้นก่อนจัดการปัจจุบัน
มันทำงานได้สำหรับฉันและฉันโพสต์รหัสในกรณีที่คนอื่นต้องการและถามว่าใครรู้ว่าฉันมองข้ามอะไร

หวังว่ามันจะมีประโยชน์:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}

คุณดูเหมือนจะไม่มีคำสั่ง "if" เกี่ยวกับการเรียกใช้ baseOnException () .... และ (exceptionHandledByPreviousHandler ||! context.ExceptionHandled || ... ) ยกเลิกกันและจะเป็นจริงเสมอ ฉันพลาดอะไรไปรึเปล่า?
joelvh

ก่อนอื่นฉันจะตรวจสอบว่าตัวจัดการอื่นใดที่เรียกใช้ก่อนหน้าปัจจุบันจัดการข้อยกเว้นและฉันเก็บผลลัพธ์ไว้ในตัวแปร: exceptionHandlerdByPreviousHandler จากนั้นฉันก็ให้โอกาสผู้จัดการปัจจุบันจัดการข้อยกเว้น: baseOnException (บริบท)
ilmatte

ก่อนอื่นฉันจะตรวจสอบว่าตัวจัดการอื่นใดที่เรียกใช้ก่อนหน้าปัจจุบันจัดการข้อยกเว้นและฉันเก็บผลลัพธ์ไว้ในตัวแปร: exceptionHandlerdByPreviousHandler จากนั้นฉันก็ให้โอกาสผู้จัดการปัจจุบันจัดการข้อยกเว้น: baseOnException (บริบท) หากไม่มีการจัดการข้อยกเว้นก่อนหน้านี้สามารถเป็น: 1 - จัดการโดยตัวจัดการปัจจุบันดังนั้น: exceptionHandledByPreviousHandler = false และ! context.ExceptionHandled = false 2 - ไม่ได้จัดการโดยตัวจัดการปัจจุบันและ: exceptionHandledByPreviousHandler = บริบทและ! ข้อยกเว้นจับจริง เฉพาะกรณีที่ 1 จะเข้าสู่ระบบ
ilmatte
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.