Dieser Artikel nimmt am "Golden Stone Project teil. 60.000 Cash-Preis teilen"
Reihenfolge
Heute habe ich mit meinen Kollegen über Auffälligkeiten gechattet, die ich hier organisiere
目前公司中使用的 自定义异常是 extend RuntimeException
Erbschaft Ausnahme
Vererben wir Ausnahmen in der Geschäftsentwicklung verlängern RuntimeException oder Exception?
Ich dachte, es muss eine RuntimeException sein, aber warum? Kann Ausnahme nicht auswählen?
Der Unterschied zwischen RuntimeException und Exception
Bevor wir darüber sprechen, müssen wir feststellen, was unsere Bedürfnisse sind
brauchen
Die Anforderung besteht darin, eine in einem Unternehmen verwendete Ausnahme anzupassen
Nach Ermittlung der Anforderungen analysieren wir
Hier wissen wir, dass unsere Geschäftsentwicklung im Grunde eine Laufzeitausnahme ist, also verwenden Sie RuntimeException
Hier stellt sich eine Frage: Wenn wir normalerweise IO-Operationen durchführen, werden wir oft beliebt und lassen uns werfen oder versuchen, zu fangen. Welches Attribut macht es?
Sehen Sie sich zuerst ein Stück Code an
Aber diese Ausnahme liegt daran, dass die von der createNewFile-Methode ausgelöste Ausnahme nichts damit zu tun hat, ob es sich um eine RuntimeException handelt oder nicht.
public boolean createNewFile() throws IOException {
SecurityManager security = System.getSecurityManager();
if (security != null) security.checkWrite(path);
if (isInvalid()) {
throw new IOException("Invalid file path");
}
return fs.createFileExclusively(path);
}
复制代码
Es ist verwandt, non-RuntimeException erfordert Throws oder try catch, aber das ist nicht automatisch, es ist das, was Entwickler tun müssen, wenn sie Code schreiben, was bedeutet, dass diese Ausnahme überprüft werden muss
Und andere Verweise Teil von Seite 434 des Buches Principles of Programming Languages
Dieses Stück hinterlässt eine Frage darüber, welches man im Geschäft verwenden soll.
Wie unterscheidet es sich von anderen RuntimeException-Codes?
Es gibt keinen Unterschied, das heißt, einer erbt RuntimeException, der andere erbt Exception und sonst nichts
Ausnahmen in Transaktionen abfangen
我们到这 知道了继承异常应该用RuntimeException,但是我们应该知道 阿里规约手册 中有这么一段
1、让检查异常也回滚:你就需要在整个方法前加上@Transactional(rollbackFor=Exception.class)
2、让非检查异常不回滚:
需要加入@Transactional(notRollbackFor=RunTimeException.class)
3、不需要事务管理(or 日志丢失)
需要加入@Transactional(propagation=Propagation.NOT_SUPPORTED)
为什么?
Exception类下面除了runtimeException还有SQLException和ioException
如果方法没有抛出runtimeException 而是抛出 SQLException和ioException那么事务是不会回滚的
那么这就结束了吗?在我们编码过程中,如果方法要抛出一些可检查异常时是需要throws进行显式指定异常类的
那么问题来了,我们都知道方法签名中默认是throws RuntimeException,已知SqlException不是RuntimeException的子类
小总结
@Transactional(notRollbackFor=RunTimeException.class) 是因为抛弃了 IO异常和 SQL异常等情况,所以 我们 应该用 Transactional(rollbackFor=Exception.class)
为什么 不是 rollbackFor = Throwable.class 呢
Dies muss nicht explizit angegeben werden rollbackFor = Throwable.class
, da Spring die Transaktion standardmäßig rückgängig macht, falls dies geschieht 错误
. **
Mit Ausnahme von non-RuntimeException befinden sich ursprünglich andere bereits in der Transaktionsverwaltung
In seiner Standardkonfiguration markiert der Transaktionsinfrastrukturcode des Spring Framework nur Transaktionen für das Runtime-Rollback mit ungeprüften Ausnahmen, das heißt ausgelösten Ausnahmen, die Instanzen oder Unterklassen von RuntimeException sind. (Fehler werden auch - standardmäßig ein Rollback verursachen) . Geprüfte Ausnahmen, die von transaktionalen Methoden ausgelöst werden, verursachen in der Standardkonfiguration kein Rollback. **
oder ansehen DefaultTransactionAttribute
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
复制代码
Spezifischer Standort docs.spring.io/spring-frame…
Zusammenfassend sollte @Transactional(rollbackFor=Exception.class) für Transaktionen verwendet werden
Was sind die Anwendungsszenarien anderer Middleware für Ausnahmen und warum?
Schauen Sie sich zuerst Nacos an
//检查 异常
public class NacosException extends Exception {
}
复制代码
beim Benutzen
Es gibt Würfe und versuchen zu fangen
Was löst also die Nacos-Ausnahme aus?
private <T extends Response> T requestToServer(AbstractNamingRequest request, Class<T> responseClass)
throws NacosException {
try {
xxx
} catch (Exception e) {
throw new NacosException(NacosException.SERVER_ERROR, "Request nacos server failed: ", e);
}
throw new NacosException(NacosException.SERVER_ERROR, "Server return invalid response");
}
复制代码
Raketenmq
Sehen Sie sich zuerst eine Laufzeitausnahme an
运行时异常
public class AclException extends RuntimeException {
}
复制代码
verwenden
public static void verify(String netaddress, int index) {
if (!AclUtils.isScope(netaddress, index)) {
//运行的时候 发生异常
throw new AclException(String.format("Netaddress examine scope Exception netaddress is %s", netaddress));
}
}
复制代码
Sehen Sie sich eine andere geprüfte Ausnahme an
public class MQClientException extends Exception {
}
复制代码
throws MQClientException, RemotingException, MQBrokerException
复制代码
verwenden
public TransactionSendResult sendMessageInTransaction(final Message msg,
final LocalTransactionExecuter localTransactionExecuter, final Object arg)
throws MQClientException {
TransactionListener transactionListener = getCheckListener();
if (null == localTransactionExecuter && null == transactionListener) {
//如果为空 client 异常
throw new MQClientException("tranExecutor is null", null);
}
}
复制代码
Zusammenfassen
Bei den meisten Middleware handelt es sich um Clientverbindungsfehler, Zeitüberschreitungen bei Remoteverbindungen und serverseitige Ausnahmen, bei denen es sich um Ausnahmen während der Inspektion handelt. Daher sollten Sie „Exception
aber
- Während der Geschäftsentwicklung sind die meisten Urteile leer, und es wird empfohlen, dass RunntimeException eine Laufzeitausnahme ist.
- Ausnahmen müssen während der Inspektion ständig ausgelöst werden, und RunntimeException wird aus Sicht der Codesauberkeit empfohlen
Zusammenfassen
- Die Verwendung von Remote-Verbindungen / Überprüfungen auf abnormale Verwendung sind anormal, sodass das andere Ende die Anomalie spüren kann
- Code im Unternehmen verwendet Laufzeitausnahmen
Ich empfehle weiterhin die Verwendung von „runtimeException for business“ und der Rest muss entsprechend dem Geschäftsszenario ausgewählt werden
denken
ok 那你说 远程连接使用 检查时异常,那feign 属于远程rpc,他的异常就必须是 检查时异常么?为什么?