WarsawJS #17: ExceptionID.js - sytuacje wyjątkowe w aplikacjach JS

We talk about JavaScript. Each month in Warsaw, Poland.

Speaker

Krzysztof Suszyński

"ExceptionID.js - sytuacje wyjątkowe
w aplikacjach JS"

2016-01-13

@ksuszynski

Kim jestem?

Krzysztof Suszyński

Dlaczego?

Bezpośrednia motywacja

debugging-js by Piotr Zientara @ WarsawJS #13

Słuchałem i pomyślałem, że można lepiej poradzić sobie z błędami...

Orginalny pomysł - kolega z COI: Karol Lassak

Powiem jak to okiełznać

Również nietypowe błędy

Oraz te ciężkie do znalezienia

Powiem jak sprawić, by strony 500 były przydatne

We are in future! 2016!

Aplikacje są coraz więsze

  1. Integracje, webserwisy, REST
  2. Internet of things
  3. Microserwisy
  4. DevOps == Dev + Ops + QA

Enterprise migruje do JS

  1. aplikacje Enterprise są MASYWNE!
  2. np. ponad 3000 różnych formularzy
  3. np. ponad 2 mln linii kodu
  4. około połowa kodu to frontend generowany z serwera: jsf, .net itp.
  5. ile to byłoby modułów Angular/React/Whatever??
  6. ile trwa kompilacja 1mln linii kodu w TypeScript/ES6/ES7?!?

Ilość błędów rośnie wraz ze złożonością

Wielkość kodu powoduje wykładniczy wzrost złożoności

Złożoność powoduje liniowy przyrost błędów

Rozwiązanie

ExceptionID.js - banalny pomysł

  1. biblioteka dla NodeJS oraz Bower
  2. flow pracy

moje inspiracje

  1. kod i flow pracy w Centralnym Ośrodku Informatyki, czyli tzw. CIN
  2. Google's Guava lib

Eid

          // Obiekt przechowujący informacje o błędzie
          var eid = new Eid('20160111:173211', 'WJS-001');
          // '20160111:173211' - unikalne ID
          // 'WJS-001' - opcjonalny numer referencyjny
          // z zewnętrznego źródła
        

Eid - standardowa reprezentacja

          var eid = new Eid('20160111:173211');
          eid.toString();
          ↵ [20160111:173211]<sk9ym6>
          new Eid('20160111:173211').toString();
          ↵ [20160111:173211]<b9qoq0>
          new Eid('20160111:173211', 'WJS-002').toString();
          ↵ [20160111:173211|WJS-002]<dbo1az>
        

Eid*Exception - zestaw wyjątków

  1. EidRuntimeException
  2. EidNullPointerException
  3. EidIllegalArgumentException
  4. EidIllegalStateException
  5. EidIndexOutOfBoundsException

Eid*Exception - przykłady użycia

          var eid = new Eid("20160110:095947");
          throw new EidIllegalArgumentException(eid);
          throw new EidNullPointerException("20160111:130412");
          var cause = 'No react library';
          throw new EidIllegalStateException("20150721:100554",
            ↵ cause);
        

Eid*Exception - efekt?

          ERROR 2016-01-11T22:48:42.445 EidIllegalStateException: [20150721:100554]<rww5y3> No react library
    at http://localhost:3000/browser/toplevel/eid.min.js:1:3959
    at Object.i.3.../eid (http://localhost:3000/browser/toplevel/eid.min.js:1:4211)
    at r (http://localhost:3000/browser/toplevel/eid.min.js:1:254)
    at http://localhost:3000/browser/toplevel/eid.min.js:1:305
    at http://localhost:3000/browser/toplevel/eid.min.js:1:536
    at Object.i.1.../../lib/eid (http://localhost:3000/browser/toplevel/eid.min.js:1:974)
    at r (http://localhost:3000/browser/toplevel/eid.min.js:1:254)
    at t (http://localhost:3000/browser/toplevel/eid.min.js:1:421)
    at http://localhost:3000/browser/toplevel/eid.min.js:1:438);
        

Eid*Exception - efekt?

          // podzielona linia na fragmenty
          EidIllegalStateException: ↵ // typ błędu, zawsze
          [20150721:100554] ↵ // ID unikalne, zawsze
          <rww5y3> ↵ // losowe ID, zawsze
          No react library // komunikat, opcjonalny
        

Eid*Exception - error 500 page done right

Mając numer Eid wiemy gdzie wystąpił błąd w oryginalnym kodzie

Ale skąd te numery?

Generatory Eid - flow pracy

Aby pracować wydajnie i uniknąć copy & paste, potrzebne nam generatory...

  1. EidGenerator for Netbeans IDE
  2. Generating Exception Id number in Intellij IDEA with Live Templates

W najbliższych planach wsparcie dla IDE Atom

EidPreconditions

  1. Zestaw wygodnych metod pomocniczych
  2. Połączenie pomysłu Google w bibiotece Guava z Eid
  3. Przyśpieszenie procesu developmentu

Przykład importu:

          var checkNotNull = Eid.preconditions.checkNotNull;
        

EidPreconditions - checkArgument

checkArgument method should be used to check argument of the method, and validate it in technical terms (not business terms)

          function sqrt(value) {
            checkArgument(value >= 0.0, "20150718:012333");
            // if ok, calculate the square root
          }
        

EidPreconditions - checkState

checkState method should be used to check state of the class in given moment, and validate it in technical terms (not business terms)

          checkState(r >= 0.0 && mass > 0.0, "20150721:115016");
        

EidPreconditions - checkNotNull

checkNotNull method should be used to check, if given not null argument is actually null

          var safeUser = checkNotNull(user, "20150721:115515");
          // także checkNotUndefined
          // oraz checkNotNullable
        

EidPreconditions - checkElementIndex

checkElementIndex method can be used to test parameters of an array, before being used

          checkElementIndex(index, list.length, "20150721:115749");
        

EidPreconditions - tryToExecute

tryToExecute method can be used to handle operations, that are intended to operate properly, but technically can fail

          var content = EidPreconditions.tryToExecute(function() {
            var fs = require('fs');
            return fs.readFileSync('bower.json');
          }, "20150718:121521");
        

Bonusowo!

Eid - logowanie

          log.debug(new Eid("20151119:121814")
           ↵ .makeLogMessage("REST request: %s", request));
        

output:

          2017-01-08 16:45:34,334 DEBUG [20151119:121814]<d1afca> 
           ↵ REST request received: <RestRequest user=<User id=345>
           ↵ flow=ShowLastTransactions step=Confirm>
        

Linki

  1. ExceptionID.js @ Github
  2. Eid - live showcase
  3. Google's guava preconditions explained
  4. EidGenerator for Netbeans IDE
  5. Generating Exception Id number in Intellij IDEA with Live Templates
  6. Piotr Zientara @ WarsawJS #13
  7. @ksuszynski

See you @ WarsawJS

Fork me on Github

Fullscreen