Add-in ArcGIS 10: การจัดการข้อยกเว้นระดับบนสุด


10

Add-in ArcGIS 10 ที่ฉันกำลังใช้งานนั้นค่อนข้างง่าย - เพียงแค่การควบคุมเครื่องมือและหน้าต่างที่สามารถเชื่อมต่อได้ ฉันกำลังจัดการข้อยกเว้นเฉพาะที่ฉันคาดว่าจะเกิดขึ้นที่แหล่งที่มาและขว้างทุกอย่างอื่น แต่วิธีปฏิบัติที่ดีที่สุดสำหรับการจัดการข้อยกเว้นที่ไม่คาดคิดเหล่านั้นใน Add-in Framework คืออะไร

ขณะนี้ฉันเพิ่งทำcatch (System.Exception ex)และแสดงใน MessageBox ในทุกวิธีที่ไม่มีวิธีระดับสูงกว่าที่ฉันสามารถจัดการได้ แต่ดูเหมือนจะไม่เป็นแนวปฏิบัติที่ดีที่สุด (และแน่นอน FxCop กำลังส่งเสียงครวญคราง เกี่ยวกับมัน).

มีสิ่งอำนวยความสะดวกใด ๆ ในส่วนเสริมของ ArcGIS 10 สำหรับตัวจัดการข้อยกเว้นระดับบนสุดที่จะต้องถูกยกตัวอย่างเช่นไปที่Application.ThreadExceptionหรือAppDomain.UnhandledExceptionเหตุการณ์?

การเห็นว่าเป็น Add-in เป็นเพียงไลบรารีคลาสและไม่ใช่แอปพลิเคชันที่ไม่สามารถเข้าถึงรหัสเริ่มต้นของแอปพลิเคชันพื้นฐาน (จากสิ่งที่ฉันรวบรวมเหตุการณ์เหล่านั้นต้องได้รับการติดตั้งแต่ต้นในกระบวนการเริ่มต้น) ฉันจะถามว่าผู้เชี่ยวชาญคนใดมีคำแนะนำใด ๆ เกี่ยวกับวิธีจัดการข้อยกเว้น "ที่ไม่คาดคิด" ใน Add-in


1
แค่ FYI: นี่คือลิงค์ที่พยายามทำให้เรื่องนี้คงที่ esri นิดหน่อย
Erik L

@ blah238 คุณทำอะไรเพื่อแก้ไขปัญหาของคุณ คุณช่วยชี้แนะให้ฉันเพื่อจัดการกับข้อยกเว้นที่ไม่ได้จัดการได้ไหม?
Emi

ใส่ตัวจัดการข้อยกเว้นในทุกจุดเข้าสู่รหัสของคุณ
blah238

ทุกจุดเข้า !! ไม่มีวิธีอื่นในการจัดการจากระดับสูงสุดหรือไม่
Emi

นั่นคือความเข้าใจของฉันใช่ ดูลิงก์ @baens ด้านบนหากคุณต้องการดูการปรับปรุงนี้
blah238

คำตอบ:


7

เท่าที่ฉันสามารถบอกได้ว่าคุณกำลังใช้การจัดการข้อผิดพลาดที่ ESRI กำลังนำมาใช้เป็นแนวทางปฏิบัติที่ดีที่สุด หากคุณต้องจับข้อยกเว้นที่ไม่ได้จัดการของแอปพลิเคชัน ( ArcMap ) ไว้คุณอาจแสดงข้อความเกี่ยวกับข้อผิดพลาดที่ไม่ได้เป็นส่วนหนึ่งของ AddIn ของคุณ AddIns ส่วนใหญ่ที่คุณเขียนอาจเป็นปุ่มและที่จริงมีเพียงสองเส้นทางหลักเท่านั้นที่ข้อผิดพลาดที่ไม่คาดคิดจะถูกจับและแสดง ( onClickและonUpdate )

เพียงจำไว้ว่าให้ใช้ ' throw ' แทน ' throw ex ' มีความแตกต่างนาที แต่มันส่งผลในการรักษาเชื้อสายของข้อผิดพลาดในขณะที่มันฟองขึ้นจากฟังก์ชั่นที่เรียกว่า


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

@Troy Schmidt โปรดช่วยชี้ให้ฉันดูเมื่อฉันใช้หน้าต่างที่สามารถเชื่อมต่อได้ฉันจะจัดการข้อยกเว้นที่ไม่สามารถจัดการได้อย่างไร แล้วฉันควรจะ "โยน" จากที่ไหนและอย่างไร
Emi

2

ฉันกำลังทำงานกับ Add-in ของ ArcGIS Add-in ของฉันประกอบด้วยหน้าต่างที่สามารถเชื่อมต่อได้และตัวควบคุมเครื่องมือ ฉันพยายามที่จะเก็บบันทึกข้อผิดพลาดของ ArcGIS เพราะเครื่องมือของฉัน และฉันก็ประสบความสำเร็จในการจัดการข้อยกเว้นระดับบนสุดโดยใช้ Application.ThreadException เนื่องจากข้อยกเว้นเธรดใช้งานได้กับ UI เธรดเท่านั้นหลังจากหน้าต่างการย้ายฐานข้อมูลได้แบบทันทีข้อยกเว้นใด ๆ ที่อาจเป็นสาเหตุของความผิดพลาดของ ArcGIS นั้นจะจับได้ แต่จะไม่ทำงานก่อนที่จะสร้างหน้าต่างที่เทียบท่าได้

    public class AddinImpl : ESRI.ArcGIS.Desktop.AddIns.DockableWindow
    {
        private WatershedDelineationDockableWindow m_windowUI;

        public WatershedDelineationDockableWindow GetUI
        {
            get
            {
                return m_windowUI;
            }
        }

        public AddinImpl()
        {
            Application.ThreadException += MYThreadHandler;
            Log.Info("Creating dockable window.");
        }

        static void MYThreadHandler(object sender, ThreadExceptionEventArgs e)
        {
            Log.Error("unhandled error in thread " + e.Exception.ToString());
            MessageBox.Show("unhandled error in thread " + e.Exception.ToString());
        }

        protected override IntPtr OnCreateChild()
        {
            m_windowUI = new WatershedDelineationDockableWindow(this.Hook);
            return m_windowUI.Handle;
        }

        protected override void Dispose(bool disposing)
        {
            if (m_windowUI != null)
                m_windowUI.Dispose(disposing);

            base.Dispose(disposing);
            Log.Info("Closing dockable window ");
        }
    }

นี่เป็นการจัดการข้อยกเว้นระดับบนสุดหลังจาก UI ที่สร้างอินสแตนซ์


น่าสนใจขอบคุณที่โพสต์สิ่งที่คุณค้นพบ ฉันจะต้องเล่นกับสิ่งนี้ โดยเฉพาะอย่างยิ่งฉันสงสัยว่าหน้าต่างที่เชื่อมต่อได้นั้นจำเป็นจริง ๆ หรือสามารถตั้งค่าในส่วนขยายได้หรือไม่
blah238

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