Strawberry defines its library-specific exceptions in strawberry.exceptions
.
This exception is raised when strawberry.field
is used with both resolver
and default_factory
arguments.
@strawberry . type
class Query :
@strawberry . field ( default_factory = lambda : "Example C" )
def c ( self ) -> str :
return "I'm a resolver"
# Throws 'Field "c" on type "Query" cannot define a default_factory and a resolver.'
This exception is raised when strawberry.field
is used with both resolver
and default
arguments.
def test_resolver () -> str :
return "I'm a resolver"
@strawberry . type
class Query :
c: str = strawberry. field ( default = "Example C" , resolver = test_resolver)
# Throws 'Field "c" on type "Query" cannot define a default value and a resolver.'
This exception is raised when a Generic
type is added to the Strawberry Schema
without passing any type to make it concrete.
This exception is raised when strawberry.argument
is used multiple times in a
type annotation.
import strawberry
from typing_extensions import Annotated
@strawberry . field
def name (
argument : Annotated[
str ,
strawberry. argument ( description = "This is a description" ),
strawberry. argument ( description = "Another description" ),
]
) -> str :
return "Name"
# Throws 'Annotation for argument `argument` on field `name` cannot have multiple `strawberry.argument`s'
This exception is thrown when the type-annotation used is not supported by
strawberry.field
. At the time of writing this exception is used by Pydantic
only
class Model ( pydantic . BaseModel ):
field: pydantic.Json
@strawberry . experimental . pydantic . type ( Model , fields = [ "field" ])
class Type :
pass
This exception is raised when the DataLoader returns a different number of
results than requested.
async def idx ( keys ):
return [ 1 , 2 ]
loader = DataLoader ( load_fn = idx)
await loader. load ( 1 )
# Throws 'Received wrong number of results in dataloader, expected: 1, received: 2'
Some errors are also thrown when trying to exectuing queries (mutations or
subscriptions).
This exception is raised when the request
is missing the query
parameter.
client. post ( "/graphql" , data = {})
# Throws 'Request data is missing a "query" value'
This error is raised when the return type of a Union
is not in the list of
Union types.
@strawberry . type
class Outside :
c: int
@strawberry . type
class A :
a: int
@strawberry . type
class B :
b: int
@strawberry . type
class Mutation :
@strawberry . mutation
def hello ( self ) -> Union[A, B]:
return Outside ( c = 5 )
query = """
mutation {
hello {
__typename
... on A {
a
}
... on B {
b
}
}
}
"""
result = schema. execute_sync (query)
# result will look like:
# ExecutionResult(
# data=None,
# errors=[
# GraphQLError(
# "The type \"<class 'schema.Outside'>\" of the field \"hello\" is not in the list of the types of the union: \"['A', 'B']\"",
# locations=[SourceLocation(line=3, column=9)],
# path=["hello"],
# )
# ],
# extensions={},
# )
This exception is thrown when the Union type cannot be resolved because it's not
a strawberry.field
.
@strawberry . type
class A :
a: int
@strawberry . type
class B :
b: int
@strawberry . type
class Query :
ab: Union[A, B] = "ciao" # missing `strawberry.field` !
query = """{
ab {
__typename,
... on A {
a
}
}
}"""
result = schema. execute_sync (query, root_value = Query ())
# result will look like:
# ExecutionResult(
# data=None,
# errors=[
# GraphQLError(
# 'The type "<class \'str\'>" cannot be resolved for the field "ab" , are you using a strawberry.field?',
# locations=[SourceLocation(line=2, column=9)],
# path=["ab"],
# )
# ],
# extensions={},
# )