2015-04-14 2 views
0

Извините, что обновил вопрос, потому что его довольно тривиальный вопрос, и я должен был обратить внимание на актуальные проблемы здесь.Grails/Groovy: пользовательские транзакционные исключения

Думая об этом, единственном преимуществе будет в журналах или ради TRACIBILITY, имеющей такие пользовательских исключения было бы, вероятно, использование ..

Я поставил этот демонстрационный проект вместе Грааль: https://github.com/vahidhedayati/test-transactions который был перенесен из примера Java, найденного здесь: https://today.java.net/pub/a/today/2006/08/31/jotm-transactions-in-spring-and-hibernate.html

Мне все еще нужно работать над этим, но на данный момент я пытаюсь найти лучший подход/практику, так как я не думаю, что содержание исключительных исключений является таким же чистым, как и должен быть (немного больше, чем Java, выглядящий чем groovy)

example below source code

package com.example.exception 

class FlightNotFoundException extends TravelException { 

    public FlightNotFoundException(String message) { 
     super(message) 
    } 

    public FlightNotFoundException(Exception e) { 
     super(e.getMessage()) 
    } 

} 

Это даже правильный способ сделать класс Exception в заводной?

source code

class FlightManagerService { 

@Transactional 
def reserveFlight(BookingRequest bookingRequest) throws FlightNotFoundException { 
... 
} 

привыкает в этой службе, и каждый из этих сервисов бросает пользовательские исключения, как я сказал, что я могу видеть, единственное преимущество будет позже, чтобы проследить, которые или что было исключение .. но все это действительно необходимо, я имею в виду, что простой журнал.info/error сообщает о том, какая услуга потерпела неудачу или выбрасывает исключение в любом случае.

так что, вместо того, чтобы все это попробовать, я думаю, что мне действительно нужно объезжать, но все равно стоит очистить найти лучшую практику. Вспоминая Grails trainsaction видео я действительно удалить все попробовать уловы и, возможно, заменить метательное действие служебного:

new domainClass(name: "something", value: 'another').save() 
     throw new RuntimeException("Issue saving domainClass") 

Любого вклад оценил

Изменены добавить

После conversating с Джошуа

@Transactional 
def someThing() { 
    domainInstance.save(failOnError: true, flush: true) 
} 

должно хватить без всякой причудливой работы .. (будет делать некоторые эксперименты, когда и обновить проект git)

ответ

1

Проблема в том, что вы используете исключения для исключающих случаев. Вы пытаетесь использовать их для логики и бизнес-правил. Хотя это очень распространено, это очень распространенное злоупотребление исключениями в целом.

В лучшем случае вы должны стремиться иметь код, который не использует исключения для управления потоком. Они должны использоваться только в случаях, когда происходит нечто исключительное (например, не ожидаемое поведение).

Однако, если вы продолжаете, вы захотите убедиться, что вы не включили следы стека. Grails имеет огромные трассировки стека и заполняет их за ваши исключения, это будет огромный успех. Вы можете избежать этого, добавив следующее пользовательских исключений:

/** 
* Don't fill in the stack trace because we want things to be faster. 
**/ 
@Override 
public Throwable fillInStackTrace() { 
    // do nothing 
    return this 
} 
+0

Эй Джошуа, спасибо .. Его, вероятно, где я просто имитировал пример Java и отсюда вопрос наилучшей практики. Что касается услуги, выполняющей броски, то в порядке? возможно, я должен добавить к этому тоже[email protected] (Transactional (rollbackFor = FlightNotFoundException.class) – Vahid

+0

По умолчанию любая транзакция, созданная службой в Grails, будет отмечать транзакцию для отката (при условии, что есть транзакция и метод службы вызывается через транзакционно завернутый прокси), поэтому вы –

+0

Не верно - только исключенные исключения исключают транзакции по умолчанию. Вы можете добавить свойства в аннотацию @Transactional, чтобы указать, какие проверенные исключения должны запускать откат и/или непроверенные исключения, которые не должны. потому что Groovy играет трюки с проверенными исключениями, чтобы облегчить нашу жизнь, не означает, что не-Groovy фреймворки, такие как Spring, могут или будут играть вместе –

Смежные вопросы