Я был во многих местах, включая старый пост, которым вы любезно поделились @jdv. Но это привело меня к хорошему обходному пути. В конце концов я нашел ответ, почему Firefox воспроизводит звук, а Chrome и Safari - нет. Это не синтаксис HTML, это не кодировка файлов, ее можно найти здесь: https://bitmovin.com/play-not-play-new-autoplay-policies-safari-11-chrome-64 /
Вы можете actully определять тип в выгоде (...), но это не очень полезно:
#include <iostream>
#include <exception>
class E1 : public std::exception {};
class E2 : public std::exception {};
int main() {
try {
throw E2();
}
catch( ... ) {
try {
throw;
}
catch( const E1 & e ) {
std::cout << "E1\n";
}
catch( const E2 & e ) {
std::cout << "E2\n";
}
}
}
Короткий ответ: нет.
Длинный ответ:
Если Вы происходите, все Ваши исключения из типа общей базы (скажите станд.:: исключение), и выгода это явно затем можно использовать это для получения информации типа от исключения.
Но необходимо использовать функцию выгоды для ловли как определенный тип исключения и затем работать оттуда.
Единственное реальное использование для выгоды (...):
Отредактированный: можно извлечь информацию о типе через dynamic_cast <> () или через typid (), Хотя как указано выше это не что-то, что я рекомендую. Используйте операторы выбора.
#include <stdexcept>
#include <iostream>
class X: public std::runtime_error // I use runtime_error a lot
{ // its derived from std::exception
public: // And has an implementation of what()
X(std::string const& msg):
runtime_error(msg)
{}
};
int main()
{
try
{
throw X("Test");
}
catch(std::exception const& e)
{
std::cout << "Message: " << e.what() << "\n";
/*
* Note this is platform/compiler specific
* Your milage may very
*/
std::cout << "Type: " << typeid(e).name() << "\n";
}
}
Нет.
Выполнение так по крайней мере потребовало бы, чтобы Вы смогли получить доступ к текущему исключению. Я не полагаю, что существует стандартный способ сделать это.
После того как у Вас был экземпляр исключения, необходимо будет использовать алгоритм контроля типа. C++ не имеет свойственной поддержки этого. В лучшем случае у Вас должен был бы быть большой вопрос / оператор else if с dynamic_cast для проверки типа.
Если необходимо обработать исключения по-другому на основе того, каковы они, необходимо ловить определенные исключения. Если существуют группы исключений, что вся потребность, которая будет обработана тождественно, получая их из общего базового класса и ловя базовый класс, была бы способом пойти. Усильте питание и парадигмы языка, не боритесь против них!
Если вы используете Visual C ++ (управляемый), вы можете использовать метод GetType (), чтобы получить тип исключения и обработать его оттуда.
Например.
try
{
// Run the application
Application::Run(mainForm);
}
catch (Exception^ e)
{
String^ exception_type = e->GetType()->ToString();
throw;
}
Строка будет содержать что-то вроде «System.ArgumentOutOfRangeException».