Cara terbaik untuk menangani kesalahan dan pesan di layanan Grails

Saya memiliki aplikasi Grails, dan saya ingin mengetahui cara terbaik untuk meneruskan kesalahan dan pesan dari lapisan layanan ke pengontrol saya. Misalnya, saya mengeklik tautan di aplikasi saya yang memanggil layanan dan membawa saya ke halaman baru. Di halaman baru di aplikasi saya, saya ingin melihat daftar pesan seperti:

Information: 10 files processed successfully.

Warning: FileA is missing CreationDate

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

Saya tahu bahwa saya dapat membuat objek khusus seperti "ServiceReturnObject" dengan properti seperti:

def data
def errors
def warnings
def information

Dan minta semua layanan saya mengembalikan objek ini.

Saya juga tahu bahwa saya dapat menggunakan pengecualian, tetapi saya tidak yakin apakah itu solusi yang tepat dengan banyak pengecualian dan berbagai jenis pengecualian.

Apa praktik terbaik di sini? Contoh akan sangat membantu, terima kasih.


person user1007895    schedule 11.07.2013    source sumber


Jawaban (1)


Untuk mengembalikan kesalahan, saya akan membuat kelas pengecualian khusus, dan menggunakannya untuk menggabungkan semua kesalahan lain yang dapat dihasilkan oleh suatu layanan. Dengan begitu, Anda hanya perlu menangkap pengecualian dalam jumlah terbatas. Jika Anda memiliki lebih dari satu metode pengontrol/penutupan yang perlu mengembalikan kesalahan, saya akan memfaktorkan kode seperti ini:

Pertama, buat kelas pengecualian Anda dan letakkan di src/java di namespace yang tepat:

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;
    }
}

Sekarang, di pengontrol Anda, buat metode penanganan kesalahan dan gabungkan semua panggilan di dalamnya

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;
    }
}

Alternatifnya, Anda dapat meminta executeSafely mengonversi respons ke JSON dan merendernya secara langsung.

person Gene Golovchinsky    schedule 11.07.2013
comment
Apakah Anda kemudian hanya membuang MyExceptions dari layanan? - person Charles Wood; 04.10.2013