วิธีที่ดีที่สุดในการจัดการข้อผิดพลาดและข้อความในบริการ Grails

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

Information: 10 files processed successfully.

Warning: FileA is missing CreationDate

Error: FileB failed processing
Error: FileC failed processing
Error: FileD failed processing

ฉันรู้ว่าฉันสามารถสร้างออบเจ็กต์แบบกำหนดเองเช่น "ServiceReturnObject" ด้วยคุณสมบัติเช่น:

def data
def errors
def warnings
def information

และให้บริการทั้งหมดของฉันส่งคืนวัตถุนี้

ฉันรู้ด้วยว่าฉันสามารถใช้ข้อยกเว้นได้ แต่ฉันไม่แน่ใจว่านั่นเป็นวิธีแก้ปัญหาที่ถูกต้องหรือไม่หากมีข้อยกเว้นหลายรายการและข้อยกเว้นหลายประเภท

แนวทางปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ตัวอย่างจะเป็นประโยชน์ขอบคุณ


person user1007895    schedule 11.07.2013    source แหล่งที่มา


คำตอบ (1)


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

ขั้นแรก สร้างคลาสข้อยกเว้นของคุณและใส่ไว้ใน src/java ในเนมสเปซที่ถูกต้อง:

class MyException extends Exception {
    protected String code; // you could make this an int if you want
    public String getCode() { return code; }

    public MyException(String code, String message) {
        super(message);
        this.code = code;
    }
}

ตอนนี้ในคอนโทรลเลอร์ของคุณ ให้สร้างวิธีการจัดการข้อผิดพลาดและตัดการโทรทั้งหมดในนั้น

class MyController {
    def myService;

    def executeSafely(Closure c) {
        Map resp = [:]
        try {
            resp.data = c();
        }
        catch(MyException myEx) {
            resp.error = myEx.getMessage();
            resp.code = myEx.getCode();
        }
        catch(Exception ex) {
            resp.error = 'Unexpected error: ' + ex.getMessage();
            resp.code = 'foo';
        }

        return resp;
    }


    def action1 = {
        def resp = executeSafely {
            myService.doSomething(params);
        }

        render resp as JSON;
    }

    def action2 = {
        def resp = executeSafely {
            myService.doSomethingElse(params);
        }

        render resp as JSON;
    }
}

หรือคุณสามารถให้ executeSafely แปลงการตอบสนองเป็น JSON และแสดงผลโดยตรง

person Gene Golovchinsky    schedule 11.07.2013
comment
คุณโยนเพียง MyExceptions จากบริการหรือไม่ - person Charles Wood; 04.10.2013