Нет.
Вот несколько примеров почему:
Код шаблона невозможно записать со спецификациями исключения,
template<class T>
void f( T k )
{
T x( k );
x.x();
}
, копии могли бы бросить, передача параметров могла бы бросить, и x()
мог бы выдать некоторое неизвестное исключение.
спецификации Исключения имеют тенденцию запрещать расширяемость.
virtual void open() throw( FileNotFound );
мог бы развиться в [1 120]
virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );
, Вы могли действительно записать, что как [1 121]
throw( ... )
первое не расширяемо, второе сверхчестолюбиво, и третье действительно, что Вы имеете в виду, когда Вы пишете виртуальные функции.
Унаследованный код
при написании кода, который полагается на другую библиотеку, Вы действительно не знаете то, что это могло бы сделать, когда что-то идет ужасно неправильно.
int lib_f();
void g() throw( k_too_small_exception )
{
int k = lib_f();
if( k < 0 ) throw k_too_small_exception();
}
g
завершится, когда lib_f()
броски. Это (в большинстве случаев) не, что Вы действительно хотите. std::terminate()
никогда не должен называться. Всегда лучше позволить сбою приложения с необработанным исключением, от которого можно получить отслеживание стека, чем тихо/яростно умереть.
Пишут код, который возвращает распространенные ошибки и бросает на исключительные случаи.
Error e = open( "bla.txt" );
if( e == FileNotFound )
MessageUser( "File bla.txt not found" );
if( e == AccessDenied )
MessageUser( "Failed to open bla.txt, because we don't have read rights ..." );
if( e != Success )
MessageUser( "Failed due to some other error, error code = " + itoa( e ) );
try
{
std::vector<TObj> k( 1000 );
// ...
}
catch( const bad_alloc& b )
{
MessageUser( "out of memory, exiting process" );
throw;
}
, Тем не менее, когда Ваша библиотека просто выдает Ваши собственные исключения, можно использовать спецификации исключения для утверждения намерения.
Сначала проверьте, работает ли flush () у вас. Если это так, хорошо, если нет, это, вероятно, означает, что веб-сервер по какой-то причине выполняет буферизацию, например, включен mod_gzip.
Для чего-то вроде ping самый простой способ - это выполнить цикл внутри PHP, запустив команду «ping - c 1 "несколько раз и вызывает flush () после каждого вывода. Предполагая, что PHP настроен на прерывание, когда HTTP-соединение закрывается пользователем (обычно это значение по умолчанию, или вы можете вызвать ignore_user_abort (false), чтобы убедиться), тогда вам не нужно беспокоиться о запущенных процессах ping. .
Если действительно необходимо, чтобы вы запускали дочерний процесс только один раз и отображали его вывод постоянно, это может быть труднее - вам, вероятно, придется запускать его в фоновом режиме,
Если вы хотите запускать системные команды через PHP, изучите документацию по exec .
Я бы не рекомендовал делать это на сайте с высокой посещаемостью. , разветвление процесса для каждого запроса - довольно сложный процесс. Некоторые программы предоставляют возможность записать свой идентификатор процесса в файл, чтобы вы могли проверить и завершить процесс по желанию, но для таких команд, как ping, я не уверен, что это возможно, проверьте страницы руководства.
Вы может быть лучше обслужено простым открытием сокета на порту, который вы ожидаете прослушивать (IE: порт 80 для HTTP) на удаленном хосте, так вы будете знать, что все идет хорошо как в пользовательском пространстве, так и в сети.
Если вы пытаетесь вывести двоичные данные, посмотрите функцию заголовка php , и убедитесь, что вы установили правильный content-type и content-disposition . Просмотрите документацию , чтобы получить дополнительную информацию об использовании / отключении буфера вывода.
Try changing the php.ini file set "output_buffering = Off". You should be able to get the real time output on the page Use system command instead of exec.. system command will flush the output