Обработка определенных ошибок в JavaScript (думают исключения),

Я нашел способ сфокусировать всех предыдущих братьев и сестер (напротив ~), которые могут работать в зависимости от того, что вам нужно.

Допустим, у вас есть список ссылок и при падении на одном, все предыдущие должны стать красными. Вы можете сделать это следующим образом:

/* default link color is blue */
.parent a {
  color: blue;
}

/* prev siblings should be red */
.parent:hover a {
  color: red;
}
.parent a:hover,
.parent a:hover ~ a {
  color: blue;
}
<div class="parent">
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
  <a href="#">link</a>
</div>

98
задан cllpse 16 September 2009 в 16:23
поделиться

3 ответа

Чтобы создать собственные исключения, вы можете наследование от объекта Error:

function SpecificError () {

}

SpecificError.prototype = new Error();

// ...
try {
  throw new SpecificError;
} catch (e) {
  if (e instanceof SpecificError) {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}

Минималистичный подход без наследования от Error может заключаться в создании простого объекта, имеющего имя и свойства сообщения:

function throwSpecificError() {
  throw {
    name: 'SpecificError',
    message: 'SpecificError occurred!'
  };
}


// ...
try {
  throwSpecificError();
} catch (e) {
  if (e.name == 'SpecificError') {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}
134
ответ дан 24 November 2019 в 05:16
поделиться

Я не любил ни одного из этих решений, таким образом, я сделал свое собственное. try-catch-finally.js довольно прохладен за исключением того, что, если Вы забываете тот мало подчеркивания (_) перед попыткой затем, код будет все еще работать очень хорошо, но ничто не будет поймано никогда! Фу.

CatchFilter

я добавил CatchFilter в своем коде:

"use strict";

/**
 * This catches a specific error. If the error doesn't match the errorType class passed in, it is rethrown for a
 * different catch handler to handle.
 * @param errorType The class that should be caught
 * @param funcToCall The function to call if an error is thrown of this type
 * @return {Function} A function that can be given directly to the `.catch()` part of a promise.
 */
module.exports.catchOnly = function(errorType, funcToCall) {
  return (error) => {
    if(error instanceof errorType) {
      return funcToCall(error);
    } else {
      // Oops, it's not for us.
      throw error;
    }
  };
};

Теперь я могу отфильтровать

Теперь, я могу отфильтровать как в C# или Java:

new Promise((resolve, reject => {
   <snip><snip>
}).catch(CatchFilter.catchOnly(MyError, err =>
   console.log("This is for my error");
}).catch(err => {
   console.log("This is for all of the other errors.");
});
0
ответ дан 24 November 2019 в 05:16
поделиться

Как отмечено в комментариях ниже, это специфично для Mozilla, но вы можете использовать блоки «условного перехвата». например:

try {
  ...
  throwSpecificError();
  ...
}
catch (e if e.sender === "specific") {
  specificHandler(e);
}
catch (e if e.sender === "unspecific") {
  unspecificHandler(e);
}
catch (e) {
  // don't know what to do
  throw e;
} 

Это дает нечто более похожее на типизированную обработку исключений, используемую в Java, по крайней мере, синтаксически.

14
ответ дан 24 November 2019 в 05:16
поделиться