mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-02 22:35:43 +08:00
Enhance error handling in artifact downloading process
This commit is contained in:
@@ -545,6 +545,7 @@ class ArtifactDownloader
|
||||
}
|
||||
|
||||
$try = false;
|
||||
$last_exception = null;
|
||||
foreach ($queue as $item) {
|
||||
try {
|
||||
$instance = null;
|
||||
@@ -605,6 +606,7 @@ class ArtifactDownloader
|
||||
InteractiveTerm::finish("Download artifact {$artifact->getName()} {$item['display']} failed !", false);
|
||||
InteractiveTerm::error("Failed message: {$e->getMessage()}", true);
|
||||
}
|
||||
$last_exception = $e;
|
||||
$try = true;
|
||||
continue;
|
||||
} catch (ValidationException $e) {
|
||||
@@ -612,11 +614,12 @@ class ArtifactDownloader
|
||||
InteractiveTerm::finish("Download artifact {$artifact->getName()} {$item['display']} failed !", false);
|
||||
InteractiveTerm::error("Validation failed: {$e->getMessage()}");
|
||||
}
|
||||
$last_exception = $e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$vvv = !ApplicationContext::isDebug() ? "\nIf the problem persists, consider using `-v`, `-vv` or `-vvv` to enable verbose mode, or disable parallel downloading for more details." : '';
|
||||
throw new DownloaderException("Download artifact '{$artifact->getName()}' failed. Please check your internet connection and try again.{$vvv}");
|
||||
throw new DownloaderException("Download artifact '{$artifact->getName()}' failed. Please check your internet connection and try again.{$vvv}", previous: $last_exception, artifact_name: $artifact->getName());
|
||||
}
|
||||
|
||||
private function downloadWithConcurrency(): void
|
||||
@@ -672,8 +675,7 @@ class ArtifactDownloader
|
||||
$artifact_name = $artifact->getName();
|
||||
}
|
||||
$failed_downloads[] = ['artifact' => $artifact_name, 'error' => $e];
|
||||
InteractiveTerm::setMessage("[{$downloaded}/{$total}] Download failed: {$artifact_name}");
|
||||
InteractiveTerm::advance();
|
||||
throw $e;
|
||||
}
|
||||
// remove from pool
|
||||
unset($fiber_pool[$index]);
|
||||
|
||||
@@ -10,4 +10,15 @@ namespace StaticPHP\Exception;
|
||||
* This exception is used to indicate that a download operation has failed,
|
||||
* typically due to network issues, invalid URLs, or other related problems.
|
||||
*/
|
||||
class DownloaderException extends SPCException {}
|
||||
class DownloaderException extends SPCException
|
||||
{
|
||||
public function __construct(string $message = '', int $code = 0, ?\Throwable $previous = null, private readonly ?string $artifact_name = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
public function getArtifactName(): ?string
|
||||
{
|
||||
return $this->artifact_name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ class ExceptionHandler
|
||||
}
|
||||
}
|
||||
if (!ApplicationContext::isDebug()) {
|
||||
self::logError('⚠ If you want to see more details in console, use `-vvv` option.');
|
||||
self::logError('⚠ If you want to see more details in console, use `-v`, `-vv` or `-vvv` option.');
|
||||
}
|
||||
return self::getReturnCode($e);
|
||||
}
|
||||
@@ -232,6 +232,9 @@ class ExceptionHandler
|
||||
if ($e instanceof ExecutionException) {
|
||||
self::logError('');
|
||||
self::logError('Failed command: ' . ConsoleColor::gray($e->getExecutionCommand()));
|
||||
if ($e->getCode() !== 0) {
|
||||
self::logError(' - Exit code: ' . ConsoleColor::gray((string) $e->getCode()));
|
||||
}
|
||||
if ($cd = $e->getCd()) {
|
||||
self::logError(' - Command executed in: ' . ConsoleColor::gray($cd));
|
||||
}
|
||||
@@ -243,6 +246,26 @@ class ExceptionHandler
|
||||
}
|
||||
}
|
||||
|
||||
// get downloader info
|
||||
if ($e instanceof DownloaderException) {
|
||||
if ($artifact_name = $e->getArtifactName()) {
|
||||
self::logError('Failed artifact: ' . ConsoleColor::gray($artifact_name));
|
||||
}
|
||||
$cause = $e->getPrevious();
|
||||
if ($cause instanceof ExecutionException) {
|
||||
self::logError('');
|
||||
self::logError('Last failed command: ' . ConsoleColor::gray($cause->getExecutionCommand()));
|
||||
if ($cause->getCode() !== 0) {
|
||||
self::logError(' - Exit code: ' . ConsoleColor::gray((string) $cause->getCode()));
|
||||
}
|
||||
if ($cd = $cause->getCd()) {
|
||||
self::logError(' - Command executed in: ' . ConsoleColor::gray($cd));
|
||||
}
|
||||
} elseif ($cause instanceof DownloaderException || $cause instanceof ValidationException) {
|
||||
self::logError('Cause: ' . ConsoleColor::gray($cause->getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
// validation error
|
||||
if ($e instanceof ValidationException) {
|
||||
self::logError('Failed validation module: ' . ConsoleColor::gray($e->getValidationModuleString()));
|
||||
|
||||
@@ -174,6 +174,7 @@ abstract class Shell
|
||||
$process = proc_open($cmd, $descriptors, $pipes, $cwd, env_vars: $env, options: PHP_OS_FAMILY === 'Windows' ? ['create_process_group' => true] : null);
|
||||
|
||||
$output_value = '';
|
||||
$process_completed = false;
|
||||
try {
|
||||
if (!is_resource($process)) {
|
||||
throw new ExecutionException(
|
||||
@@ -251,11 +252,15 @@ abstract class Shell
|
||||
}
|
||||
}
|
||||
|
||||
$process_completed = true;
|
||||
return [
|
||||
'code' => $status['exitcode'],
|
||||
'output' => $output_value,
|
||||
];
|
||||
} finally {
|
||||
if (!$process_completed && is_resource($process)) {
|
||||
proc_terminate($process);
|
||||
}
|
||||
fclose($pipes[1]);
|
||||
fclose($pipes[2]);
|
||||
if ($file_res !== null) {
|
||||
|
||||
Reference in New Issue
Block a user