【问题标题】:What is the best practice for terminating a Swift-Server using Perfect during server startup?在服务器启动期间使用 Perfect 终止 Swift-Server 的最佳实践是什么?
【发布时间】:2016-11-27 20:39:29
【问题描述】:

我正在使用完美的服务器端 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)")
}

【问题讨论】:

    标签: swift perfect


    【解决方案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 使用退出代码来检查应用程序进程信息,在某些情况下,您可以在系统日志中看到这些退出代码(如果有)。

    【讨论】:

    • 酷。我不知道 exit() 在这种情况下可用。我想我会改用它。谢谢!我会试试这个,如果我喜欢,请回来并为你的回答点赞。
    • 是的,如果 Foundation 被导入,stdlib 的 C 语言中的所有内容都将可用,swift build 正在调用 clang ...您可以说 swift 是 C、C++、C# 或你可以称它为 C##、C、...大声笑小心!在您的 Perfect Server 中应用 Foundation 库时,您必须知道自己在做什么,因为 macOS 和 Linux 在 Foundation 实现的操作系统级别上存在差异。所以我想建议 A 计划 - 简单,独立于操作系统
    • 我们刚刚改进了这种非常特殊的配置和服务器启动控制。请检查下面描述的新方法:github.com/PerfectlySoft/PerfectDocs/blob/master/guide/…
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2013-07-12
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多