0

Python ソケット サーバーがあります。このソケット サーバーでは、新しいクライアントが接続して自身の認証に成功すると、json でエンコードされた情報をデータベースから取得します。それをデコードすると、変数になります。オブジェクトにキーが存在しない場合があります。KeyError が発生し、スクリプト全体がシャットダウンします。例えば:

クライアントがサーバーにパケットを送信すると、サーバーはそれを次のように処理します。

def handleReceiveThisPacket(self, data):
    myInfo = self.info['exampleKey']
    return self.send(myInfo)

「exampleKey」がユーザーの情報に存在しない場合 (新しいパケットを処理するために情報に新しいキーを追加し、ユーザーの情報がまだ更新されていない場合のように発生します)、全体スクリプトがシャットダウンします。簡単に try, except を実行できることはわかっていますが、スクリプト全体でキーを呼び出すことがよくあります。PHP と同様に、Python が警告を発するがシャットダウンしないようにする簡単な方法はありますか?

また、クライアントは別のクラスです。

4

5 に答える 5

5

例外処理を使用します。例外をキャッチします。それらが存在する唯一の理由は、通常のプログラムが単純であり、常にエラー チェックを行う必要がないからです。getまた、辞書からオプションのキーを取得するには、メソッドを使用できます

def handleReceiveThisPacket(self, data):
    # returns None if key not found
    myInfo = self.info.get('exampleKey')

    # returns 42 if key not found
    myInfo = self.info.get('exampleKey', 42)

    try:
        return self.send(myInfo)
    except Exception as e:
        print("Oops an exception occurred")
        print(e)
于 2013-08-18T18:22:33.070 に答える
1

まず第一に、PHP 言語は多くの不適切な設計上の決定を下しましたが、これはその 1 つにすぎません。Python がこれらの問題を適切に検出して処理してくれることに満足してください。私は個人的に、警告をまったく出さない PHP コードをいつも書いていました。警告が表示されると、許容できるものと実際の問題を区別するのは困難です。

次に、いくつかの方法で問題を処理できます。

  • これらの例外は上位レイヤーで処理できます (ダースではなく 1 または 2)。
  • defaultdictを使用できます。
  • ユーティリティ関数を使用できます。

例:

def getkey(d, k):
  try:
    return d[k]
  except KeyError:
    return ""

これらすべてのソリューションには、コードが脆弱になるという重大な欠陥があることに注意してください。キーに対して作成できる可能性のあるすべてのタイプミスを検出することはできません。

最も明確な方法は、欠落しているキーの値をデータセットに入力することだと思いますそのため、エラー処理を行う必要はありません。

于 2013-08-18T18:21:29.473 に答える
1

in演算子を使用してコレクションに何かがあるかどうかを確認できます。

>>> import json
>>> o = json.loads('{"a": 1}')
>>> "a" in o
True
>>> "b" in o
False

>>> o = dict(a=1)
>>> "a" in o
True
>>> "b" in o
False

>>> o = (1,2,3)
>>> 1 in o
True
>>> 4 in o
False

また、dictには.get(key, default=None)メソッドがあります。

于 2013-08-18T18:22:43.383 に答える
0

例外をキャッチします。このリンクでは、Python での例外処理について説明しています。try... except KeyError...関連するコードをaで囲みます。

または、ディクショナリ メソッド get を使用します。myInfo = self.info.get('exampleKey', default_value)KeyError を発生させず、default_value'exampleKey' が myInfo にない場合に戻ります。

3 番目のオプションは、キーが最初に辞書にあるかどうかを確認することですif 'exampleKey' in self.info: myInfo = self.info['exampleKey']

于 2013-08-18T18:24:56.330 に答える