Как лучше всего завершить работу Swift-сервера с помощью Perfect во время запуска сервера?
Я использую Perfect на стороне сервера Swift и у меня есть некоторые условия в main.swift, где сервер должен быть прерван до фактического запуска. Есть ли лучшая практика для обработки этого завершения?
В настоящее время я выдаю ошибку, потому что return
не работает - потому что это не в контексте функции (см. This is the error I'm throwing and concerned about.
ниже). Вот что у меня так далеко:
//
// main.swift
//
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
enum ServerStartupError : Error {
case FailedUserControllerSetup
}
if !UserController.setup() {
// This is the error I'm throwing and concerned about.
throw ServerStartupError.FailedUserControllerSetup
}
let server = HTTPServer()
let serverRoutes = ServerRoutes()
serverRoutes.addRoutes(server: server)
server.serverPort = 8181
do {
// Launch the HTTP server.
try server.start()
} catch PerfectError.networkError(let err, let msg) {
print("Network error thrown: \(err) \(msg)")
}
1 ответ
Извините, я виноват, я вас неправильно понял! Обратите внимание, что throw на верхнем уровне main.swift не имеет смысла, потому что единственный процесс, который поймает эту ошибку, это ОС. Пожалуйста, попробуйте код ниже:
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
if UserController.setup() {
let server = HTTPServer()
let serverRoutes = ServerRoutes()
serverRoutes.addRoutes(server: server)
server.serverPort = 8181
do {
// Launch the HTTP server.
try server.start()
} catch PerfectError.networkError(let err, let msg) {
print("Network error thrown: \(err) \(msg)")
} catch (let panic) {
print("panic: \(panic)")
} //end server starting
} else {
// here is the code that prompting user to finish the setup
// before running the server. The program will display this
// message and automatically exit the process (end of program)
print("Setup is not completed.")
}//end if
В качестве альтернативы, вы также можете использовать функцию exit() для предварительного выхода из main.swift с импортом Foundation (стандартной библиотеки), как показано ниже:
//
// main.swift
//
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
import Foundation
if !UserController.setup() {
// This is the error I'm throwing and concerned about.
print("ServerStartupError.FailedUserControllerSetup")
exit(-1)
}//end if
let server = HTTPServer()
let serverRoutes = ServerRoutes()
serverRoutes.addRoutes(server: server)
server.serverPort = 8181
do {
// Launch the HTTP server.
try server.start()
} catch PerfectError.networkError(let err, let msg) {
print("Network error thrown: \(err) \(msg)")
} catch (let panic) {
print("Panic: \(panic)")
}
exit(0)
Оба метода имеют свои плюсы и минусы. Первый не требует ничего другого, в то время как второй нуждается в Foundation Library; Также я бы сказал, что второй является более традиционным и может предоставить код выхода, который позволяет вам перехватить ошибку, поместив ее в загрузчик индивидуальной настройки или что-то в этом роде. Unix / Linux использует код выхода для проверки информации о процессе приложения, и в некоторых случаях вы можете увидеть эти коды выхода в системном журнале, если он доступен.