1

我正在使用 Perfect 服务器端 Swift,并且在 main.swift 中有一些条件,服务器应该在实际启动之前终止。是否有处理此终止的最佳实践?

目前,我抛出一个错误,因为 areturn不起作用——因为它不在函数的上下文中(见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)")
}
4

1 回答 1

1

对不起,是我的错,我误会你了!请注意,抛出 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 使用退出代码来检查应用程序进程信息,在某些情况下,您可以在系统日志中看到这些退出代码(如果有)。

于 2016-11-30T16:31:24.647 回答