Как лучше всего завершить работу 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 использует код выхода для проверки информации о процессе приложения, и в некоторых случаях вы можете увидеть эти коды выхода в системном журнале, если он доступен.

Другие вопросы по тегам