Нетривиальная обработка ошибок

16
Нетривиальная обработка ошибок Презентацию подготовил Сергей Яркин Тензор, 2015

Upload: oelifantiev

Post on 27-Jul-2015

135 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: Нетривиальная обработка ошибок

Нетривиальная обработка ошибок

Презентацию подготовилСергей ЯркинТензор, 2015

Page 2: Нетривиальная обработка ошибок

Генерация ошибки

var err = new Error( "Oh, no way!" );

if( err instanceof Error ) { //}

Page 3: Нетривиальная обработка ошибок

Структура объекта

err -> {[Error] 'message': "Oh, no way!", 'name' : "Error", 'stack' : "at ..."}

Page 4: Нетривиальная обработка ошибок

Базовые паттерны

● try/catch

● callback( err, result );

● EventEmitter.emit( 'error', ... );

process.on( 'uncaughtException', func );

+ Domain

Page 5: Нетривиальная обработка ошибок

Структура вызовов, пример

func01( callback ) func11( callback ) func21( callback ) func22( callback ) func12( callback ) func23( callback ) func31( callback ) func41( callback ) func51( callback ) func24( callback )

Page 6: Нетривиальная обработка ошибок

Существующие типы ошибок

● Error● RangeError● ReferenceError● SyntaxError● TypeError● URIError

Page 7: Нетривиальная обработка ошибок

Облако СБИС

Page 8: Нетривиальная обработка ошибок

Чудо-облако

Управление диспетчерами

Одинаковая конфигурация на всех диспетчерах!

Новая конфигурация

Пул

дис

петч

еров

Page 9: Нетривиальная обработка ошибок

Управление диспетчерами (2)

...

M

B

DB replica

Page 10: Нетривиальная обработка ошибок

Архитектура узлаM

aste

r pr

oces

s Web Interface

RPC

API

Poller

Группы процессов Вызов метода в другом модуле

Page 11: Нетривиальная обработка ошибок

Код ошибки

Object.defineProperty( Error.prototype, 'code', { value: -1, writable: true });

Ничто не предвещает беды...

Page 12: Нетривиальная обработка ошибок

Код ошибки (2)var ERRORS = { // Core errors 0x00000000: { name: 'UNKNOWN_ERROR', text: "Unknown error" }, // File system errors 0x00000100: { name: 'FS_UNKNOWN', parent: EFSError, text: "Unknown file system error" }, 0x00000101: { name: 'FS_ENOENT' , parent: EFSError, text: "No such file or directory" }, 0x00000103: { name: 'FS_EACCES' , parent: EFSError, text: "Permission denied" }, 0x00000104: { name: 'FS_EMFILE' , parent: EFSError, text: "Too many open files" }, // Network errors 0x00000200: { name: 'NET_UNKNOWN', parent: ENetError, text: "Unknown network error" }, 0x00000201: { name: 'NET_UNREACH', parent: ENetError, text: "Host is unreachable" }, 0x00000202: { name: 'NET_REFUSED', parent: ENetError, text: "Connection refused" }, ...};

Object.defineProperties( Error.prototype, { 'isFsError' : { get: function() { return (this.code & 0xffffff00) == 0x00000100 } }, 'isNetError': { get: function() { return (this.code & 0xffffff00) == 0x00000200 } }, 'isDbError' : { get: function() { return (this.code & 0xffff0000) == 0x00010000 } }, ...});

Page 13: Нетривиальная обработка ошибок

Свои типы ошибок

global.ECustom = function ECustom( msg, … ) { … };inherits( ECustom, Error );

ECustom.prototype.is = function is( compare_to ) { … };

ECustom.exportError = function exportError( err ) { … };ECustom.importError = function importError( err ) { … };

ECustom

Page 14: Нетривиальная обработка ошибок

Свои типы ошибок (2)

● EBadFormat● EFSError● ENetError● EDBError● ETimeOut● EEntExists● ENoEnt● EEntBadState● EParseError● EWrongValue

Page 15: Нетривиальная обработка ошибок

Создание и обработка ошибок

new EDBError( Error.DB_NOT_AUTHENTICATED )new EEntExists( Error.DB_DUPLICATE_KEY )new ENoEnt( "No worker found" )new EWrongValue( "Handler not found" )new ENetError( Error.NET_UNREACH )new ENoEnt( Error.JSRPC_METHOD_NOT_FOUND )

if( (err instanceof ECustom) && err.is("config") ) { … }

if( err.is(EEntBadState) && err.is("cluster is off") ) { … }

new ECustom([ "Config #%d for instance '%s' does not exists!", cfg_ver, inst.ident ])

Page 16: Нетривиальная обработка ошибок

Вопросы?