7

2つの表現があります。例外を発生させる場合は1つの式を試す必要がありますが、2番目の式も例外を発生させる場合は、例外を発生させます。

私はこれを試しましたが、見た目が醜く、この問題を解決するための最良の方法かどうかはわかりません。

try:                                                           
    image = self.images.order_by(func.random()).limit(1)       
except:                                                        
    try:                                                       
        image = self.images.order_by(func.rand()).limit(1)     
    except ProgrammingError:                                   
        raise ProgrammingError(                                
            'The database engine must be PostgtreSQL or MySQL')

どうしますか?

4

5 に答える 5

5

ループを使用します。

for methname in ("random", "rand"):
    try:
        image = self.images.order_by(getattr(func, methname)()).limit(1)
        break
    except ProgrammingError:
        continue
else:
    raise ProgrammingError("The database engine must be PostgtreSQL or MySQL")

ループの句は、ループが正常に終了しelseた場合 (つまり なしbreak) にのみ実行されます。この句が で使用されることはめったにないため、これが巧妙すぎると考える場合は、次の方法でも機能します。breakimageelsefor

image = None
for methname in ("random", "rand"):
    try:
        image = self.images.order_by(getattr(func, methname)()).limit(1)
    except ProgrammingError:
        continue
if not image:
    raise ProgrammingError("The database engine must be PostgtreSQL or MySQL")
于 2012-08-13T14:32:17.183 に答える
5

別の機能を作ることは非常に役に立ちます。

def get_random_image(self):
    for rand in func.random, func.rand:
        try:                                                           
            return self.images.order_by(rand()).limit(1)
        except ProgrammingError:                                                        
            pass
    raise ProgrammingError('This database engine is not supported')
于 2012-08-13T14:42:00.027 に答える
2

この特定のケースでは、関数を選択する前に実際にデータベースを検出しようとします。コードからデータベース接続に到達できますか? その場合は、ドライバ名をオンにするだけです:

random = None
if drivername == 'postgres':
    random = func.random
elif drivername == 'mysql':
    random = func.rand
else:
    raise ValueError('This module requires that you use PostgreSQL or MySQL')

次に、画像を選択するときに、次のrandom値を使用します。

image = self.images.order_by(random()).limit(1)
于 2012-08-13T14:35:39.623 に答える
0

rand または random がクラスの関数であるかどうかを確認したい場合は、次を使用することもできます

if 'rand' in dir(some object of a class)
于 2012-08-13T14:40:44.753 に答える
0

実際には、設計上の欠陥である可能性があります。例外を発生させることは、通常は発生しないイベントに対処することです。機能的に何かを実行したい場合 (例外の処理を除く)、試してみたい最初のステートメントは、例外を取得するステートメントではないように見えます。

したがって、代わりに:

try:
    do statement 1
except ...
    try:
        do statement 2
    except:

について考える :

if (statement_1 result == ...)
    try:
         do statement 2
    except:
于 2012-08-13T14:33:02.807 に答える