Exception oder RuntimeException für benutzerdefinierte Ausnahmen im Geschäftsleben Warum?

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

image.png

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

image.png

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

image.png

Dieses Stück hinterlässt eine Frage darüber, welches man im Geschäft verwenden soll.

image.png

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 而是抛出 SQLExceptionioException那么事务是不会回滚的

那么这就结束了吗?在我们编码过程中,如果方法要抛出一些可检查异常时是需要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

image.png

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

  1. Während der Geschäftsentwicklung sind die meisten Urteile leer, und es wird empfohlen, dass RunntimeException eine Laufzeitausnahme ist.
  2. Ausnahmen müssen während der Inspektion ständig ausgelöst werden, und RunntimeException wird aus Sicht der Codesauberkeit empfohlen

Zusammenfassen

  1. Die Verwendung von Remote-Verbindungen / Überprüfungen auf abnormale Verwendung sind anormal, sodass das andere Ende die Anomalie spüren kann
  2. 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,他的异常就必须是 检查时异常么?为什么? 

Guess you like

Origin juejin.im/post/7166976169152086024